Как рассчитать MD5 файла xls на языке C

Я провел много исследований о MD5 файла xls, но мои усилия, похоже, были напрасны. Я попытался использовать lirary и рекомендации в этой ссылке " https://stackru.com/questions/27858288/calculate-md5-for-a-file-in-c-language"но, все же, дайте неправильный результат, вы можете мне помочь??

3 ответа

Решение

Я обычно отвечал на ссылку, которую вы дали, но тогда вопрос был закрыт. Идея заключается в следующем. Сначала прочитайте файл в буфер. Вы можете сделать это используя следующую функцию:

unsigned char * readFile(const char *path)
{
    FILE * pFile;
    long lSize;
    unsigned char * buffer;
    size_t result;

    pFile = fopen (path , "rb" );
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

    // obtain file size:
    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);
    rewind (pFile);

    // allocate memory to contain the whole file:
    buffer = malloc (sizeof(char)*lSize);
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

    // copy the file into the buffer:
    result = fread (buffer,1,lSize,pFile);
    if (result != lSize) {fputs ("Reading error",stderr); exit (3);}


    // terminate
    fclose (pFile);

    return buffer;
}

Читать файл

unsigned char * data = readFile("c:\\file.xls");

Затем вы должны применить MD5 к этому буферу данных. Вы можете использовать код, похожий на тот, что в этом вопросе (хотя я не уверен, какую библиотеку / реализацию md5 автор этого вопроса использовал). например,

 char hash[64] = {0};
 md5_byte_t digest[16] = {0};
 md5_init(&state);
 md5_append(&state, (const md5_byte_t  *)data, filesize);
 md5_finish(&state,digest);
 int i=0;      
 for(i; i<16; i++)
 {
      snprintf(hash + i*2,sizeof(hash),"%02x",digest[i]);
 }

Сейчас hash должен хранить хеш файла, закодированный в шестнадцатеричной строке. пс. Действительно, этот образец неправильно использует strlen с двоичным файлом. Вот почему я предложил readFile метод выше; эта функция также содержит код для получения размера файла - вы можете использовать этот код для получения размера файла, а затем передать размер файла md5_append метод.

пс. также не забудьте freedata когда вы закончите с этим.

MD5 файла xls очень похож на MD5 любого другого типа файла, поскольку он работает с байтами. Посмотрите на примере реализации openssl openssl/crypto/md5/md5.c и md5test.c (код находится в git://git.openssl.org/openssl.git).

Проблема в том, что ваш пример использует strlen определить размер файла. Но .xls Формат двоичный, поэтому strlen не будет работать должным образом.

Адаптируйте функцию, чтобы она возвращала итоговые данные, прочитанные из файла, и она должна работать.

Редактировать. Попробуйте что-то вроде этого кода:

void *addr;
struct stat s;
int ret, fd;

ret = stat(filename, &s);
if (ret) {
    fprintf(stderr, "Error while stat()ing file: %m\n");
    return -1;
}

fd = open(filename, O_RDONLY);;
if (fd < 0) {
    fprintf(stderr, "Error while opening file: %m\n");
    return -1;
}

addr = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr == MAP_FAILED) {
    fprintf(stderr, "Error while mapping file: %m\n");
    close(fd);
    return -1;
}

md5_init(&state);
md5_append(&state,addr, s.st_size);
md5_finish(&state,digest);
Другие вопросы по тегам