google了好久都没有找到合适的,其实我只需要一个函数,能计算文件的 md5 值就好,
后来找到了 md5.h 和 md5.c 的源文件,仿照别人的封装了个函数(他那个有问题,和 md5sum 计算出来的都不一样)。
废话少说,直接贴 代码 : (再废一句话,如果只想计算字符串的md5值,把字符串传给 MD5Update 函数一次就好)
#include "md5.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define READ_DATA_SIZE 1024 #define MD5_SIZE 16 #define MD5_STR_LEN (MD5_SIZE * 2) int Compute_file_md5(const char *file_path, char *value); int main(int argc, char *argv[]) { int ret; const char *file_path = "temp"; char md5_str[MD5_STR_LEN + 1]; ret = Compute_file_md5(file_path, md5_str); if (0 == ret) { printf("[file - %s] md5 value:\n", file_path); printf("%s\n", md5_str); } return 0; } int Compute_file_md5(const char *file_path, char *md5_str) { int i; int fd; int ret; unsigned char data[READ_DATA_SIZE]; unsigned char md5_value[MD5_SIZE]; MD5_CTX md5; fd = open(file_path, O_RDONLY); if (-1 == fd) { perror("open"); return -1; } // init md5 MD5Init(&md5); while (1) { ret = read(fd, data, READ_DATA_SIZE); if (-1 == ret) { perror("read"); return -1; } MD5Update(&md5, data, ret); if (0 == ret || ret < READ_DATA_SIZE) { break; } } close(fd); MD5Final(&md5, md5_value); for(i = 0; i < MD5_SIZE; i++) { snprintf(md5_str + i*2, 2+1, "%02x", md5_value[i]); } md5_str[MD5_STR_LEN] = '\0'; // add end return 0; }行效果 如下图:
// c md5源码网上很多,就不上传了
另外一篇//
网上有 md5.c , md5.h, 但是里面只有 MD5Init(), MD5Update(), MD5Final() 三个函数,
只可以直接对字符进行操作, 而没有直接求文件md5的接口. 以下是我的实现, 可计算32位和16位的md5值.
- /*****************************************************************************
- * Copyright : All Rights Reserved.
- *
- * Date : 2012-09-15 22:37:49
- * Author/Corporation : Dengzhaoqun
- * Email : dengzhaoqun@163.com
- *****************************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "md5.h"
- char *MD5_file (char *path, int md5_len)
- {
- FILE *fp = fopen (path, "rb");
- MD5_CTX mdContext;
- int bytes;
- unsigned char data[1024];
- char *file_md5;
- int i;
- if (fp == NULL) {
- fprintf (stderr, "fopen %s failed\n", path);
- return NULL;
- }
- MD5Init (&mdContext);
- while ((bytes = fread (data, 1, 1024, fp)) != 0)
- {
- MD5Update (&mdContext, data, bytes);
- }
- MD5Final (&mdContext);
- file_md5 = (char *)malloc((md5_len + 1) * sizeof(char));
- if(file_md5 == NULL)
- {
- fprintf(stderr, "malloc failed.\n");
- return NULL;
- }
- memset(file_md5, 0, (md5_len + 1));
- if(md5_len == 16)
- {
- for(i=4; i<12; i++)
- {
- sprintf(&file_md5[(i-4)*2], "%02x", mdContext.digest[i]);
- }
- }
- else if(md5_len == 32)
- {
- for(i=0; i<16; i++)
- {
- sprintf(&file_md5[i*2], "%02x", mdContext.digest[i]);
- }
- }
- else
- {
- fclose(fp);
- free(file_md5);
- return NULL;
- }
- fclose (fp);
- return file_md5;
- }
- int main(int argc, char *argv[])
- {
- char *md5;
- md5 = MD5_file("temp", 16);
- printf("16: %s\n", md5);
- free(md5);
- md5 = MD5_file("temp", 32);
- printf("32: %s\n", md5);
- free(md5);
- return 0;
- }