C语言计算文件的md5值

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值.


  1. /***************************************************************************** 
  2.  *  Copyright          :  All Rights Reserved. 
  3.  * 
  4.  *  Date               :  2012-09-15 22:37:49 
  5.  *  Author/Corporation :  Dengzhaoqun 
  6.  *  Email              :  dengzhaoqun@163.com 
  7.  *****************************************************************************/  
  8. #include <stdio.h>  
  9. #include <stdlib.h>  
  10. #include <string.h>  
  11.   
  12. #include "md5.h"  
  13.   
  14. char *MD5_file (char *path, int md5_len)  
  15. {  
  16.     FILE *fp = fopen (path, "rb");  
  17.     MD5_CTX mdContext;  
  18.     int bytes;  
  19.     unsigned char data[1024];  
  20.     char *file_md5;  
  21.     int i;  
  22.   
  23.     if (fp == NULL) {  
  24.         fprintf (stderr, "fopen %s failed\n", path);  
  25.         return NULL;  
  26.     }  
  27.   
  28.     MD5Init (&mdContext);  
  29.     while ((bytes = fread (data, 1, 1024, fp)) != 0)  
  30.     {  
  31.         MD5Update (&mdContext, data, bytes);  
  32.     }  
  33.     MD5Final (&mdContext);  
  34.       
  35.     file_md5 = (char *)malloc((md5_len + 1) * sizeof(char));  
  36.     if(file_md5 == NULL)  
  37.     {  
  38.         fprintf(stderr, "malloc failed.\n");  
  39.         return NULL;  
  40.     }  
  41.     memset(file_md5, 0, (md5_len + 1));  
  42.       
  43.     if(md5_len == 16)  
  44.     {  
  45.         for(i=4; i<12; i++)  
  46.         {  
  47.             sprintf(&file_md5[(i-4)*2], "%02x", mdContext.digest[i]);  
  48.         }  
  49.     }  
  50.     else if(md5_len == 32)  
  51.     {  
  52.         for(i=0; i<16; i++)  
  53.         {  
  54.             sprintf(&file_md5[i*2], "%02x", mdContext.digest[i]);  
  55.         }  
  56.     }  
  57.     else  
  58.     {  
  59.         fclose(fp);  
  60.         free(file_md5);  
  61.         return NULL;  
  62.     }  
  63.       
  64.     fclose (fp);  
  65.     return file_md5;  
  66. }  
  67.   
  68. int main(int argc, char *argv[])  
  69. {  
  70.     char *md5;  
  71.       
  72.     md5 = MD5_file("temp", 16);  
  73.     printf("16: %s\n", md5);  
  74.     free(md5);  
  75.       
  76.     md5 = MD5_file("temp", 32);  
  77.     printf("32: %s\n", md5);  
  78.     free(md5);  
  79.     return 0;  
  80. }  


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值