admin管理员组文章数量:1026989
HEX文件学习心得
一、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();
<-------------------------------------------------分割线------------------------------------------------------------>
hex(hexadecimal),十六进制的英文缩写,*.hex为后缀的文件为称之为hex文件,主要用于保
存单片机固件,可直接下载到单片机中,故又称为可执行文件
1、 hex文件内容
打开任意一个hex文件,内容如下(为了内容展示方便,已删除中奖部分内容):
整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示), 2个ASCII码字符表示1个Hex字节。
2、 hex文件解析
hex文件的内容都是有规律的编码,我们可以对它进行解析,以第一行 :020000040800F2 为例:
1) 每一行都以 :(0x3A)开头
2) 第1个字节0x02 ,表示数据区的字节个数,用ASCII表示就是4个ASCII字符
3) 第2、3字节0x00, 0x00 ,表示偏移地址或无用填0
4) 第4个字节0x04, 表示本行记录的数据类型
‘00’ Data Record :用来记录数据, HEX文件的大部分记录都是数据记录
‘01’ End of File Record :用来标识文件结束,放在文件的最后,标识HEX文件的结尾
‘02’ Extended Segment Address Record :用来标识扩展段地址的记录
‘03’ Start Segment Address Record :段地址 STM32不用
‘04’ Extended Linear Address Record :用来标识扩展线性地址
‘05’ Start Linear Address Record :程序启动运行的地址
5) 第5、6个字节0x08, 0x00即是数据
6) 第7个字节0xF2是校验字节,校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。
7) 每条数据最后还有<0x0d> (回车键)、 <0x0a>(换行键)
总结:hex文件的数据行可按如下方式解析:
注意:由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear Address Record。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。例如:
:020000040004F6
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x0004,
第二行是Data Record,里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为 (0x0004 << 16) | 0x0000,也就是写入FLASH的0x40000这个地址。
第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过7k的时候,文件中就会出现多个Extended Linear Address Record。
3、 分析示例:
:020000040800F2 -----首行给出烧录的目标地址的高16位 : 0x0800
:100000003807002029020008B90300086F03000820 ----烧写到0x0800 0000 处的数据
:10001000B5030008D10200084706000800000000F0 ----烧写到0x0800 0010 处的数据
:040000050800018965 ----05类型的行对于烧写程序无用
:00000001FF ----HEX文件结束行
--- 完 ---
————————————————
版权声明:本文为CSDN博主「轻松学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
HEX文件学习心得
一、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();
<-------------------------------------------------分割线------------------------------------------------------------>
hex(hexadecimal),十六进制的英文缩写,*.hex为后缀的文件为称之为hex文件,主要用于保
存单片机固件,可直接下载到单片机中,故又称为可执行文件
1、 hex文件内容
打开任意一个hex文件,内容如下(为了内容展示方便,已删除中奖部分内容):
整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示), 2个ASCII码字符表示1个Hex字节。
2、 hex文件解析
hex文件的内容都是有规律的编码,我们可以对它进行解析,以第一行 :020000040800F2 为例:
1) 每一行都以 :(0x3A)开头
2) 第1个字节0x02 ,表示数据区的字节个数,用ASCII表示就是4个ASCII字符
3) 第2、3字节0x00, 0x00 ,表示偏移地址或无用填0
4) 第4个字节0x04, 表示本行记录的数据类型
‘00’ Data Record :用来记录数据, HEX文件的大部分记录都是数据记录
‘01’ End of File Record :用来标识文件结束,放在文件的最后,标识HEX文件的结尾
‘02’ Extended Segment Address Record :用来标识扩展段地址的记录
‘03’ Start Segment Address Record :段地址 STM32不用
‘04’ Extended Linear Address Record :用来标识扩展线性地址
‘05’ Start Linear Address Record :程序启动运行的地址
5) 第5、6个字节0x08, 0x00即是数据
6) 第7个字节0xF2是校验字节,校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。
7) 每条数据最后还有<0x0d> (回车键)、 <0x0a>(换行键)
总结:hex文件的数据行可按如下方式解析:
注意:由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear Address Record。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。例如:
:020000040004F6
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x0004,
第二行是Data Record,里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为 (0x0004 << 16) | 0x0000,也就是写入FLASH的0x40000这个地址。
第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过7k的时候,文件中就会出现多个Extended Linear Address Record。
3、 分析示例:
:020000040800F2 -----首行给出烧录的目标地址的高16位 : 0x0800
:100000003807002029020008B90300086F03000820 ----烧写到0x0800 0000 处的数据
:10001000B5030008D10200084706000800000000F0 ----烧写到0x0800 0010 处的数据
:040000050800018965 ----05类型的行对于烧写程序无用
:00000001FF ----HEX文件结束行
--- 完 ---
————————————————
版权声明:本文为CSDN博主「轻松学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
本文标签: HEX文件学习心得
版权声明:本文标题:HEX文件学习心得 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/IT/1694664043a254760.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论