Administratorzy gnysek Opublikowano 12 Listopada 2009 Administratorzy Udostępnij Opublikowano 12 Listopada 2009 Modyfikuję sobie źródło 39Dlla, zeby sobie policzyć MD5 pliku. W delphi miałem kod na sumę kontrolną, to sobie przerobiłem pod C++: (dla małych plików jest OK (np. 200B), problem jest chyba po drugim przejściu przez pętlę While). void CalculateFileMD5(char *fname, char *checksum) { int i; MD5_CTX m_md5; char buffer[1024]; FILE *plik; int bytes=0, totalBytes = 0,size = 0; plik = fopen( fname , "r"); fseek (plik , 0 , SEEK_END); size = ftell (plik); rewind (plik); MD5Init(&m_md5, 0); while( ( bytes = fread( buffer, sizeof( char ), sizeof( buffer ) - 1, plik ) ) > 0 && totalBytes<size ) { totalBytes+=bytes; MD5Update(&m_md5, (unsigned char*)buffer, bytes); } //MD5Update(&m_md5, (unsigned char*)buffer, length); MD5Final(&m_md5); for (i = 0; i < 16; i++) sprintf(checksum+i*2,"%02x", m_md5.digest[i]); fclose( plik ); } Oryginał delphi: function MD5Stream(const Stream: TStream): TMD5Digest; var Context: TMD5Context; Buffer: array[0..4095] of Byte; Size: Integer; ReadBytes : Integer; TotalBytes : Integer; SavePos: Integer; begin MD5Init(Context); Size:=Stream.Size; SavePos:=Stream.Position; TotalBytes:=0; try Stream.Seek(0, soFromBeginning); repeat ReadBytes:=Stream.Read(Buffer, SizeOf(Buffer)); Inc(TotalBytes, ReadBytes); MD5Update(Context, @Buffer, ReadBytes); until (ReadBytes = 0) or (TotalBytes = Size); finally Stream.Seek(SavePos, soFromBeginning); end; MD5Final(Result, Context); end; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 12 Listopada 2009 Udostępnij Opublikowano 12 Listopada 2009 size powinien byc typu long, fopen z parametrem "rb" (read binary). na razie tyle wylapalem, szukam dalej. char buffer[1024]; ... (unsigned char*)buffer to wreszcie char czy unsigned char? to jest roznica wbrew pozorom Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 12 Listopada 2009 Autor Administratorzy Udostępnij Opublikowano 12 Listopada 2009 Tak, to "RB", bo znalazłem w sieci jakiś inny program który to robi, kod nieczytelny, ale samo fread wyłapałem :P void CalculateFileMD5(char *fname, char *checksum) { int i; MD5_CTX m_md5; unsigned char buffer[1024]; FILE *plik; int bytes=0; plik = fopen( fname , "rb"); if ( plik == NULL ) { return; } MD5Init(&m_md5, 0); while( ( bytes = fread( buffer, 1, 1024, plik ) ) ) { MD5Update(&m_md5, buffer, bytes); } MD5Final(&m_md5); for (i = 0; i < 16; i++) sprintf(checksum+i*2,"%02x", m_md5.digest[i]); fclose( plik ); } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi