将一串32个字节的十六进制数转为16个字节并存到文件中

        将32个字节的十六进制数转为16个字节且存到文件中,源于从json中获取到的MD5是32个字节,而某个可执行文件需要读取到的MD5文件是16个字节的,故需要将32个字节的十六进制数转为16个字节且存到文件中。output[j] = (((one_atoi & 0xff) << 4) + (two_atoi  & 0xff))起关键性作用,比如有“8a”两个数,one_atoi & 0xff会将‘8’转成0xf8,然后再左移4位变成0x80,而two_atoi & 0xff会将‘a’转成0xfa,0x80 + 0xfa 等于0x8a,0x8a占一个字节。如此,便能将32个字节的十六进制数转为16个字节,并存于文件中。

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main()
{
	int i, j;
	char one[16] = {0};
	char two[16] = {0};
	char output[16] = {0};
	char *intput = "6029A80E72AA114C547FC79C1EC361B7";
	
	for (i = 0, j = 0; i < strlen(intput); i += 2, j++)
	{
		int one_atoi = 0;
		int two_atoi = 0;
		sprintf(one, "%c", intput[i]);
		sprintf(two, "%c", intput[i + 1]);
		
		if (!strcmp(one,"a") || !strcmp(one,"A") || !strcmp(one,"b") || !strcmp(one,"B") ||
			!strcmp(one,"c") || !strcmp(one,"C") || !strcmp(one,"d") || !strcmp(one,"D") ||
			!strcmp(one,"e") || !strcmp(one,"E") || !strcmp(one,"f") || !strcmp(one,"F"))
		{
			if (!strcmp(one,"a") || !strcmp(one,"A")){
				one_atoi = 10;
			}else if (!strcmp(one,"b") || !strcmp(one,"B")){
				one_atoi = 11;
			}else if (!strcmp(one,"c") || !strcmp(one,"C")){
				one_atoi = 12;
			}else if (!strcmp(one,"d") || !strcmp(one,"D")){
				one_atoi = 13;
			}else if (!strcmp(one,"e") || !strcmp(one,"E")){
				one_atoi = 14;
			}else if (!strcmp(one,"f") || !strcmp(one,"F")){
				one_atoi = 15;
			}
		}else
		{
			one_atoi = atoi(one);
		}

		if (!strcmp(two,"a") || !strcmp(two,"A") || !strcmp(two,"b") || !strcmp(two,"B") ||
			!strcmp(two,"c") || !strcmp(two,"C") || !strcmp(two,"d") || !strcmp(two,"D") ||
			!strcmp(two,"e") || !strcmp(two,"E") || !strcmp(two,"f") || !strcmp(two,"F"))
		{
			if (!strcmp(two,"a") || !strcmp(two,"A")){
				two_atoi = 10;
			}else if (!strcmp(two,"b") || !strcmp(two,"B")){
				two_atoi = 11;
			}else if (!strcmp(two,"c") || !strcmp(two,"C")){
				two_atoi = 12;
			}else if (!strcmp(two,"d") || !strcmp(two,"D")){
				two_atoi = 13;
			}else if (!strcmp(two,"e") || !strcmp(two,"E")){
				two_atoi = 14;
			}else if (!strcmp(two,"f") || !strcmp(two,"F")){
				two_atoi = 15;
			}
		}else
		{
			two_atoi = atoi(two);
		}

		output[j] = (((one_atoi & 0xff) << 4) + (two_atoi  & 0xff));
		printf("output:%02x\n", output[j]);
	}
	 
	for (i = 0; i < 16; i++)
        {
		printf("%02x", output[i]);
	}
	printf("\n");

	FILE *firm = fopen("/test/Firmware.md5","wb");
	if(firm)
	{
		fwrite(output,1,strlen(output),firm);
		fclose(firm);
	}

	unsigned char md5_code[16];
	int fd = open("/home/ccq/test/Firmware.md5", O_RDONLY);
	if (fd <= 0)
	{
		printf("not open Firmware.md5");
		return -1;
	}
	int ret = read(fd, md5_code, 16);
	if (ret <= 0)
	{
		close(fd);
		return -1;
	}
	printf("\t-->code:");
	for (i = 0; i < 16; i++)
	  printf("%02x", md5_code[i]);
	printf("\n");

	close(fd);

	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值