参考https://blog.csdn.net/zsy19881226/article/details/46879887
依赖openssl里面的-lcrypto libcrypto.so库
#include
unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);
int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, unsigned long len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
方法一: 场景---数据较少
unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);
单独使用这个函数生成unsigned char *md, md可以为数组,长度16即可
方法二: 场景---数据较多,如文件
int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, unsigned long len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
MD5_Update传输数据,可以重复使用这个函数直到所有数据更新进去。最后使用MD5_Final即结果返回unsigned char *md里
实例:方法二
bool cal_check_number(const char *filename,char *check_number)
{
char data[1024]={0};
unsigned char md[16]={0};
int readbytes=0;
MD5_CTX ctx;
MD5_Init(&ctx);
FILE* file =fopen(filename, "r");
if(!file){
printf("fopen failed\n");
return false;
}
while(!feof(file) ){
memset(data,0,sizeof(data));
if( (readbytes=fread(data,1,sizeof(data),file)) > 0)
MD5_Update(&ctx, data, readbytes );
}
MD5_Final( md , &ctx);
snprintf(check_number, 33, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",\
md[0],md[1],md[2],md[3],md[4],md[5],md[6],md[7],\
md[8],md[9],md[10],md[11],md[12],md[13],md[14],md[15]);
printf("check_number cal---- [%s]",check_number);
return true;
}