一、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();