微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux C中文件的md5sum

我想在Linux C中find一个文件的md5sum,是否有任何API可以发送文件名来获得该文件的md5sum。

Gameboy模拟器播放比预期的更快

如何在Linux和Solaris中编译C?

如何在Linux中使用bluez API来查找RSSi和距离

将文本放入LibreOffice文档的程序

我如何在Linux上用C语言获得我的IP地址?

这里有代码

另外,openssl库有md5函数(从这里 ):

#include <openssl/md5.h> #include <unistd.h> int main() { int n; MD5_CTX c; char buf[512]; ssize_t bytes; unsigned char out[MD5_DIGEST_LENGTH]; MD5_Init(&c); bytes=read(STDIN_FILENO,buf,512); while(bytes > 0) { MD5_Update(&c,bytes); bytes=read(STDIN_FILENO,512); } MD5_Final(out,&c); for(n=0; n<MD5_DIGEST_LENGTH; n++) printf("%02x",out[n]); printf("n"); return(0); }

您可以使用popen运行md5sum并读取输出

#include <stdio.h> #include <ctype.h> #define STR_VALUE(val) #val #define STR(name) STR_VALUE(name) #define PATH_LEN 256 #define MD5_LEN 32 int CalcFileMD5(char *file_name,char *md5_sum) { #define MD5SUM_CMD_FMT "md5sum %." STR(PATH_LEN) "s 2>/dev/null" char cmd[PATH_LEN + sizeof (MD5SUM_CMD_FMT)]; sprintf(cmd,MD5SUM_CMD_FMT,file_name); #undef MD5SUM_CMD_FMT FILE *p = popen(cmd,"r"); if (p == NULL) return 0; int i,ch; for (i = 0; i < MD5_LEN && isxdigit(ch = fgetc(p)); i++) { *md5_sum++ = ch; } *md5_sum = ''; pclose(p); return i == MD5_LEN; } int main(int argc,char *argv[]) { char md5[MD5_LEN + 1]; if (!CalcFileMD5("~/testfile",md5)) { puts("Error occured!"); } else { printf("Success! MD5 sum is: %sn",md5); } }

你可以使用mhash库(许可证是LGPL)。 在Debian系统上:

sudo apt-get install libmhash-dev

看man page man 3 mhash

但是我不认为你可以给它一个文件的名字。 您必须自己打开文件,读取数据,并将数据提供给该库的函数

如果您正在为文件生成MD5散列并将其与字符串进行比较,则可以使用该散列。

在这里,我使用了D'Nabre的代码,从另一个SO回答和Michael Foukarakis的十六进制字符串到这个SO答案的字节数组代码 。 它需要链接到OpenSSL库(gcc md5.c -o md5 -lssl)才能正常工作。

示例用法

unsigned char *file_hash = md5_for_file("~/testfile"); if (md5_is_match_str(file_hash,"b7be4ec867f9b0286b91dd40178774d6")) { printf("Matchn"); } else { printf("Mismatchn"); } free(file_hash);

md5.h:

#ifndef MD5_H #define MD5_H /** Caller to free result */ unsigned char *md5_for_file(char *filename); /** md5_1 & md5_2 maybe NULL */ int md5_is_match(unsigned char *md5_1,unsigned char *md5_2); /** md5 maybe NULL */ int md5_is_match_str(unsigned char *md5,const char *md5_str); #endif //MD5_H

md5.c:

#include "md5.h" #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/md5.h> // Print the MD5 sum as hex-digits. void print_md5_sum(unsigned char *md) { int i; for (i = 0; i < MD5_DIGEST_LENGTH; i++) { printf("%02x",md[i]); } printf("n"); } // Get the size of the file by its file descriptor unsigned long get_size_by_fd(int fd) { struct stat statbuf; if (fstat(fd,&statbuf) < 0) exit(-1); return statbuf.st_size; } unsigned char *md5_for_file(char *filename) { int file_descript; unsigned long file_size; char *file_buffer; unsigned char *result = malloc(sizeof(*result) * MD5_DIGEST_LENGTH); if (NULL == result) { printf("malloc Failedn"); goto END; } printf("using file:t%sn",filename); file_descript = open(filename,O_RDONLY); if (file_descript < 0) exit(-1); file_size = get_size_by_fd(file_descript); printf("file size:t%lun",file_size); file_buffer = mmap(0,file_size,PROT_READ,MAP_SHARED,file_descript,0); MD5((unsigned char *) file_buffer,result); munmap(file_buffer,file_size); print_md5_sum(result); END: return result; } int md5_is_match(unsigned char *md5_1,unsigned char *md5_2) { if (!md5_1 || !md5_2) { return 0; } int i; for (i = 0; i < MD5_DIGEST_LENGTH; i++) { if (md5_1[i] != md5_2[i]) { return 0; } } return 1; } int md5_is_match_str(unsigned char *md5,char *md5_str) { if (!md5 || !md5_str) { return 0; } /** Make byte arrary from md5_str */ unsigned char md5_arr[MD5_DIGEST_LENGTH] = {0}; const char *pos = md5_str; size_t count = 0; /* WARNING: no sanitization or error-checking whatsoever */ for (count = 0; count < sizeof(md5_arr) / sizeof(md5_arr[0]); count++) { sscanf(pos,"%2hhx",&md5_arr[count]); pos += 2; } for (count = 0; count < sizeof(md5_arr) / sizeof(md5_arr[0]); count++) { printf("%02x",md5_arr[count]); } printf("n"); /** actual comparison */ if (memcmp(md5,md5_arr,MD5_DIGEST_LENGTH)) { return 0; } return 1; }

对Raja问的一个简单答案,使用sje397的答案,可以在C程序中计算文件的md5sum,如下所示。 另外请注意,当您可以使用do while循环时,不需要两次写入读取命令。

int calculate_md5sum(char *filename) { //open file for calculating md5sum FILE *file_ptr; file_ptr = fopen(filename,"r"); if (file_ptr==NULL) { perror("Error opening file"); fflush(stdout); return 1; } int n; MD5_CTX c; char buf[512]; ssize_t bytes; unsigned char out[MD5_DIGEST_LENGTH]; MD5_Init(&c); do { bytes=fread(buf,1,512,file_ptr); MD5_Update(&c,bytes); }while(bytes > 0); MD5_Final(out,out[n]); printf("n"); return 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐