2015-01-12 31 views
1

我作出了關於XLS文件的MD5很多研究,但我的努力似乎是徒勞的 我試圖用lirary和建議,在這個環節「https://stackoverflow.com/questions/27858288/calculate-md5-for-a-file-in-c-language」 ,但還是給錯誤的結果, 你能幫助我嗎?如何計算xls文件的MD5的C語言

+0

'MD5'的xls文件?它沒有任何意義,您應該將文件讀取到緩衝區,然後在緩衝區上使用'md5'哈希算法的實現。 –

+2

該文件的結構內容無關緊要 - MD5爲任何字節流生成消息摘要。 – maerics

+0

您鏈接的問題是使用'fp = fopen(file,「r」);'打開一個文件。這會給任何二進制文件(包括xls文件)帶來錯誤的結果。 – wimh

回答

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

ps。當你完成它也不要忘記freedata

3

xls文件的MD5與任何其他類型的文件的MD5非常相似,因爲它對字節進行操作。請參閱示例openssl實現openssl/crypto/md5/md5.c和md5test.c(代碼位於git://git.openssl.org/openssl.git)。

2

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

@ user300234是的,'strCopy'也不起作用,但它也是同樣的問題。無論如何,改進我的答案。 –