簡體   English   中英

如何用C語言計算xls文件的MD5

[英]How to Calculate MD5 of xls file in C language

我已經對xls文件的MD5進行了許多研究,但我的努力似乎是徒勞的,我試圖在此鏈接中使用書庫和推薦“ https://stackoverflow.com/questions/27858288/calculate-md5-for-a-file -in-c-language “但是,仍然給出錯誤的結果,您能幫我嗎?

xls文件的MD5與其他任何類型的文件的MD5都非常相同,因為它對字節進行操作。 通過示例查看openssl實現openssl / crypto / md5 / md5.c和md5test.c(代碼在git://git.openssl.org/openssl.git中)。

好吧,我曾經回答過您給出的鏈接,但是問題就被關閉了。 這個想法如下。 首先將文件讀入緩沖區。 您可以使用以下功能執行此操作:

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應該存儲以十六進制字符串編碼的文件的散列。 ps。 確實,該示例錯誤地將strlen與二進制文件一起使用。 這就是為什么我建議上面的readFile方法; 該函數還包含獲取文件大小的代碼-您可以使用該代碼獲取文件大小,然后將文件大小傳遞給md5_append方法。

ps。 也不要忘記在處理free datafree data

問題是您的示例使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM