[英]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
data
后free
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.