我作出了关于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