我作出了關於XLS文件的MD5很多研究,但我的努力似乎是徒勞的 我試圖用lirary和建議,在這個環節「https://stackoverflow.com/questions/27858288/calculate-md5-for-a-file-in-c-language」 ,但還是給錯誤的結果, 你能幫助我嗎?如何計算xls文件的MD5的C語言
1
A
回答
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。當你完成它也不要忘記free
data
。
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'也不起作用,但它也是同樣的問題。無論如何,改進我的答案。 –
相關問題
- 1. C#計算打開的文件的MD5?
- 2. 計算C語言
- 3. C#語言,計算器
- 4. 我應該如何在C#中計算文件hash(md5&SHA1)
- 5. 計算每個文件的MD5
- 6. 計算大文件的Md5哈希
- 7. 計算視頻文件的MD5(哈希)
- 8. Md5在C語言中的實現POS
- 9. 計算在彙編語言文件
- 10. 如何使用我的APK計算特定文件的CRC32/MD5
- 11. C#MD5計算問題
- 12. 是否可以直接用T-SQL語言計算MD5散列?
- 13. 如何在保存到gridfs之前計算文件的MD5
- 14. 如何計算Python中文件的md5校驗和?
- 15. 使計算器使用C語言
- 16. 計算採用c編程語言
- 17. 用C語言計算C2000設備
- 18. 預計算MD5
- 19. 布爾計算器語言的語法
- 20. C語言 - 如何創建PostScript文件
- 21. 計算壓縮zip文件中文件的MD5哈希
- 22. 如何解析xls文件? (已知的語言:Python和Java的,LUA)
- 23. 如何在C#中計算「a」的MD5散列?
- 24. C# - 自我計算md5以檢查該文件未被修改
- 25. 如何計算C語言矩陣乘法
- 26. 如何用C++語言編寫一個小型計算器?
- 27. 如何在Python中進行C語言計算
- 28. c語言中的多語句算法
- 29. 語言分類(計算)
- 30. C#XML語言文件
'MD5'的xls文件?它沒有任何意義,您應該將文件讀取到緩衝區,然後在緩衝區上使用'md5'哈希算法的實現。 –
該文件的結構內容無關緊要 - MD5爲任何字節流生成消息摘要。 – maerics
您鏈接的問題是使用'fp = fopen(file,「r」);'打開一個文件。這會給任何二進制文件(包括xls文件)帶來錯誤的結果。 – wimh