将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;
}