Administratorzy gnysek Opublikowano 12 Listopada 2009 Administratorzy 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;
PsichiX Opublikowano 12 Listopada 2009 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
Administratorzy gnysek Opublikowano 12 Listopada 2009 Autor Administratorzy 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 ); }
Rekomendowane odpowiedzi