hex文本解析
第一个字节(01):表示本行的数据长度.
第二个,第三个字节(2312):表示本行数据的起始地址.
第四字节表示数据类型(00),数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。
‘00’ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
‘01’ End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾
‘02’ Extended Segment Address Record:用来标识扩展段地址的记录
‘03’ Start Segment Address Record:开始段地址记录
‘04’ Extended Linear Address Record:用来标识扩展线性地址的记录
‘05’ Start Linear Address Record:开始线性地址记录
最后一个字节(A8)为校验和。
校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和.
0x100 - (0x01 + 0x23 + 0x12 + 0x00 + 0x22) = 0xA8
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#define MAX_LINE 50
#define HEX_TO_TXT 1 /*转TXT文本*/
#define HEX_TO_BIN 1 /*转bin文件*/
int ParseHexFile(char * source_path);
int main(int argc,char *argv[])
{
if(argc != 2)
{
printf("error!");
return -1;
}
if(0 != ParseHexFile(argv[1]))
{
printf("Parse Hex File error!\n");
return -1;
}
printf("Parse Hex File succeed!\n");
#if HEX_TO_TXT
printf("creat object.txt succeed!\n");
#endif
#if HEX_TO_BIN
printf("creat object.bin succeed!\n");
#endif
return 0;
}
int ParseHexFile(char * source_path)
{
FILE *fp = NULL;
#if HEX_TO_TXT
FILE *fp_txt_obj = NULL;
#endif
#if HEX_TO_BIN
int flag = 0;
char flag_buf[3] = {0};
FILE *fp_bin_obj = NULL;
#endif
char buf[MAX_LINE] = {0};
int len,i;
fp = fopen(source_path,"r");
if(fp == NULL)
{
printf("Error Fail To Read");
return -1;
}
#if HEX_TO_TXT
fp_txt_obj = fopen("object.txt","w");
if(fp_txt_obj == NULL)
{
printf("open file error(object.txt)\n");
return -1;
}
#endif
#if HEX_TO_BIN
fp_bin_obj = fopen("object.bin","wb");
if(fp_bin_obj == NULL)
{
printf("open file error(object.bin)\n");
return -1;
}
#endif
while(fgets(buf,MAX_LINE,fp) != NULL)
{
len = strlen(buf);
if(len < 9)
{
printf("hex file error!\n");
fclose(fp);
return -1;
}
if (buf[8] != '0')
continue;
#if HEX_TO_TXT
for(i = 9 ;i < (len - 4);) /*保留数据位*/
{
fprintf(fp_txt_obj,"0x%c",buf[i]);
++i;
fprintf(fp_txt_obj,"%c,",buf[i]);
++i;
}
fputc('\n',fp_txt_obj);
#endif
#if HEX_TO_BIN
for(i = 9 ;i < (len - 4); i++)
{
flag_buf[0] = buf[i++];
flag_buf[1] = buf[i];
flag_buf[2] = '\n';
sscanf(flag_buf,"%x",&flag);
fwrite((const char*)&flag,1,1,fp_bin_obj);
}
memset(flag_buf, 0, sizeof(char) *2);
#endif
memset(buf, 0, sizeof(char) * MAX_LINE);
}
return 0;
}
示例效果:
原hex文件:
生成的txt文件:
生成的bin文件: