HEX文件学习心得

时间:2022-12-17 16:45:22

一、hex文件格式

hex是十六进制格式,它每行分为5个域,以“:”作为开始

II          aaaa        bb     [dddd......]           cc

     1 2              3             4                    5

1:数据域数据个数,也就是4域;

2:偏移地址;

3:类型

分为四类:

①  00 -----数据记录

②  01------文件结束记录

③  02------段偏移地址记录

④  04------ 扩展线性地址记录

4:数据域;

5:和校验码

二、列子

1、HEX86格式

段偏移地址为高4~16位地址

:02  0000  02  1262    88  

:02  0000  00  ADCD  84

那么数据域的绝对地址(寄存器地址)=  (1262<<4)+0000;

2、HEX386格式

扩展线性地址为高16为地址

:02  0000  04  1262    88  

:02  0000  00  ADCD  84

那么数据域的绝对地址(寄存器地址)=  (1262<<16)+0000;

3、结束文件格式

:00000001FF


三、代码

while(HexFile.ReadString(OneLine))//读取一行到OneLine
{
char tmp[260];
char *segAt=0;
unsigned long int address = 0;
int len = OneLine.GetLength();
for(int i=0;i<len;i++)
tmp[i]=(char)OneLine.GetAt(i);
linecount++;
if (strcmp(tmp,":00000001FF")==0) //hex文件结束,比较字符串
break;
// Hex86 segment extention扩展段地址记录
segAt=strstr(tmp,":02000002");//函数搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,则该函数返回字符串的地址;如果未找到所搜索的字符串,则返回NULL。
if(segAt)
{
segAt+=9;
newSeg= recvalue(segAt[2])*4096 + recvalue(segAt[3])*16 + recvalue(segAt[0])*16 + recvalue(segAt[1]);
segSum+=(newSeg<<4);
continue;
}
// Hex386 linear address extention
segAt=strstr(tmp,":02000004");
if(segAt)
{
segAt+=9;
newSeg= recvalue(segAt[2])*4096 + recvalue(segAt[3])*16 + recvalue(segAt[0])*16 + recvalue(segAt[1]);
segSum+=(newSeg<<16);
continue;
}
//
recordlen = recvalue(tmp[1])*16 + recvalue(tmp[2]);
address = recvalue(tmp[3])*4096 + recvalue(tmp[4])*256 + recvalue(tmp[5])*16 + recvalue(tmp[6]);
//
address+=segSum;
if(address<=min_adr) 
min_adr=address;
if(address>=max_adr) 
{
max_adr = address;
datanum = recordlen;
mlinecount = linecount;
}
for(int i=0;i<recordlen;i++)
{
outputbuffer[(address+i)*3]=tmp[2*i+9];
outputbuffer[(address+i)*3+1]=tmp[2*i+10];
}
}
HexFile.Close();