Skocz do zawartości

Zablokowane [C++] MD5 pliku, 39dll


gnysek

Rekomendowane odpowiedzi

  • Administratorzy

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

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

  • Administratorzy

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

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...