Linux下C语言计算文件的md5值(长度32)

这篇博客介绍了如何在Linux环境下使用C语言计算文件的MD5值。作者提供了修复过的md5.h和md5.c源文件,并展示了正确的运行效果。
摘要由CSDN通过智能技术生成

找到了 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;
}

运行效果 如下图:

 :

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我明白了。对于计算文件MD5,你可以在Linux下使用C语言编写一个程序,由md5main.c、md5.c和md5.h三个文件组成。以下是一个示例的实现: 1. 首先,需要定义md5.h头文件,其中包含了函数的声明和结构体的定义。例如: ```c #ifndef MD5_H #define MD5_H #include <stdint.h> typedef struct { uint32_t state[4]; uint32_t count[2]; uint8_t buffer[64]; } MD5_CTX; void MD5_Init(MD5_CTX *context); void MD5_Update(MD5_CTX *context, const uint8_t *input, size_t inputLen); void MD5_Final(uint8_t digest[16], MD5_CTX *context); #endif ``` 2. 然后,在md5.c文件实现MD5算法的具体逻辑。可以使用一些开源MD5实现库或者自己编写。以下是一个示例的实现: ```c #include "md5.h" void MD5_Init(MD5_CTX *context) { // 初始化上下文 // ... } void MD5_Update(MD5_CTX *context, const uint8_t *input, size_t inputLen) { // 更新上下文 // ... } void MD5_Final(uint8_t digest[16], MD5_CTX *context) { // 完成计算并返回结果 // ... } ``` 3. 最后,在md5main.c文件中编写主函数,调用md5.c中的函数来计算文件MD5。以下是一个示例的实现: ```c #include <stdio.h> #include "md5.h" int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <filename>\n", argv[0]); return 1; } FILE *file = fopen(argv[1], "rb"); if (file == NULL) { printf("Failed to open file\n"); return 1; } MD5_CTX context; MD5_Init(&context); size_t bytesRead; uint8_t buffer[1024]; while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) != 0) { MD5_Update(&context, buffer, bytesRead); } uint8_t digest[16]; MD5_Final(digest, &context); fclose(file); printf("MD5: "); for (int i = 0; i < 16; i++) { printf("%02x", digest[i]); } printf("\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值