在网上找了好久都找不到一个简洁完整的用代码实现计算文件MD5值得示例,所以牛刀小试自己写一个;
使用库前,可能需要预先安装openssl的RPM包。
使用的openssl库所调用的函数有三个(可以在头文件md5.h中查看即:/usr/include/openssl/md5.h):
int MD5_Init(MD5_CTX *c); //初始化一个MD5_CTX结构体;
int MD5_Update(MD5_CTX *c, const void *data, size_t len); //计算data
int MD5_Final(unsigned char *md, MD5_CTX *c); //将计算结果复制到md字符串
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/md5.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h >
#define READ_MAX_SIZE 1024
#define MD5_SIZE 16
#define MD5_STR_LEN (MD5_size * 2)
int get_md5(const char *filename, char *md5_str)
{
int fd
int ret= 0;
int i = 0;
unsigned char data[READ_MAX_SZIE];
unsigned char md5_value[MD5_SIZE];
MD5_CTX md5;
if ((fd = open(path, O_RDONLY)) < 0)
{
perror("open failed");
return -1;
}
MD5_Init(&md5);
for (;;)
{
ret = read(fd, data, READ_MAX_SIZE);
if (ret == -1)
{
perror("read failed");
close(fd);
return -1;
}
MD5_Update(&md5, data, ret);
if (ret == 0 || ret < READ_MAX_SIZE)
{
break;
}
close(fd);
}
MD5_Final((unsigned char *)&md5_value, &md5);
for (i = 0; i < MD5_SIZE, i++)
{
snprintf(md5_str + i * 2, 2 + 1, md5_value[i]);
}
md5_str[MD5_STR_LEN] = '\0';
return 0;
}
编译 gcc -o test test.c -lcrypto -lssl (这两个库一定要包含,我当初编译不过就是应为缺少这两个库)