2024年2月9日发(作者:)

bin反编译为C语言

#include

/********************************************************************************

input:

c:单个字符('0'~'9' 'a'~'f', 'A'~'F')

output:

单个字符转化为单个字符

********************************************************************************/

static uint8_t HexCharToBinBinChar(char c)

{

if (c >= '0' && c <= '9')

return c - '0';

else if (c >= 'a' && c <= 'z')

return c - 'a' + 10;

else if (c >= 'A' && c <= 'Z')

return c - 'A' + 10;

return 0xff;

}

/********************************************************************************

input:

p: 两个文本字符

output:

转化为1个字节

********************************************************************************/

static uint8_t Hex2Bin(const char *p)

{

uint8_t tmp = 0;

tmp = HexCharToBinBinChar(p[0]);

tmp <<= 4;

tmp |= HexCharToBinBinChar(p[1]);

return tmp;

}

/********************************************************************************

input:

src: hex单行字符串

p->type: 如果函数返回结果正确,这里就存着转化后的类型

p->len: 如果函数运行正确,这里就存着转化后的bin数据长度

p->data: 如果函数运行正确,长度并且不为0,该指针就只想转化后的数据

p->addr[0]: 如果函数返回结果正确,这里就存着地址的低字节

p->addr[1]: 如果函数返回结果正确,这里就存着地址的低字节

output:

返回hex格式流分析的结果

********************************************************************************/

static RESULT_STATUS HexFormatUncode(const char *src,

BinFarmat *p)

{

uint8_t check = 0, tmp[4], binLen;

uint16_t hexLen = strlen(src);

uint16_t num = 0, offset = 0;

if (hexLen > HEX_MAX_LENGTH)//数据内容过长

return RES_DATA_TOO_LONG;

if (hexLen < HEX_MIN_LEN)

return RES_DATA_TOO_SHORT;//数据内容过短

if (src[0] != ':')

return RES_NO_COLON;//没有冒号

if ((hexLen - 1) % 2 != 0)

return RES_LENGTH_ERROR;//hexLen的长度应该为奇数

binLen = (hexLen - 1) / 2;//bin总数据的长度,包括长度,地址,类型校验等内容

while (num < 4)

{

offset = (num << 1) + 1;

tmp[num] = Hex2Bin(src + offset);

check += tmp[num];

num++;

}

p->len = tmp[0];//把解析的这些数据保存到结构体中

p->addr = tmp[1];

p->addr <<= 8;

p->addr += tmp[2];

p->type = tmp[3];

while (num < binLen)

{

offset = (num << 1) + 1; //保存真正的bin格式数据流

p->data[num - 4] = Hex2Bin(src + offset);

check += p->data[num - 4];

num++;

}

if (p->len != binLen - 5)//检查hex格式流的长度和数据的长度是否一致

return RES_LENGTH_ERROR;

if (check != 0)//检查校验是否通过

return RES_CHECK_ERROR;

return RES_OK;

}

RESULT_STATUS HexFile2BinFile(char *src, char *dest)

{

FILE *src_file, *dest_file;

uint16_t addr_low = 0;

uint32_t addr_hign = 0;

char buffer_hex[600];

uint8_t buffer_bin[255];

BinFarmat gBinFor;

RESULT_STATUS res;

= buffer_bin;

src_file = fopen(src, "r");//以文本的形式打开一个hex文件

if (!src_file)

return RES_HEX_FILE_NOT_EXIST;

dest_file = fopen(dest, "wb");//以二进制写的方式打开文件,文件不存在也没影响

if (!dest_file)

return RES_BIN_FILE_PATH_ERROR;

fseek(src_file, 0, SEEK_SET); //定位到开头,准备开始读取数据

while (!feof(src_file))

{

fscanf(src_file, "%s

", buffer_hex);

res = HexFormatUncode(buffer_hex, &gBinFor);

if (res != RES_OK)

{

fclose(src_file);

fclose(dest_file);

return res;

}

switch ()

{

case 0://数据记录

addr_low = ;

//数据指针偏移

fseek(dest_file, addr_low + addr_hign, SEEK_SET);

if (fwrite((const uint8_t*), , 1,

dest_file) != 1)

{

fclose(src_file);

fclose(dest_file);

return RES_WRITE_ERROR;

}

break;

case 1: //数据结束

fclose(src_file);

fclose(dest_file);

return RES_OK;

case 2:

addr_hign = ((uint32_t)) << 2;

break;

case 4://线性段地址

addr_hign = ((uint32_t)) << 16;

break;

default:

fclose(src_file);

fclose(dest_file);

return RES_TYPE_ERROR;

}

}

fclose(src_file);

fclose(dest_file);

return RES_HEX_FILE_NO_END;

}