HEX⽂件格式,ihex,hex解析
来⾃:blog.csdn/GZFStudy/archive/2008/09/03/2873814.aspx
Intel HEX⽂件是由⼀⾏⾏符合Intel HEX⽂件格式的⽂本所构成的ASCII⽂本⽂件。在Intel HEX⽂件中,每⼀⾏包含⼀个HEX记录。这些记录由对应机器语⾔码和/或常量数据的⼗六进制编码数字组成。Intel HEX⽂件通常⽤于传输将被存于ROM或者EPROM 中的程序和数据。⼤多数EPROM编程器或模 拟器使⽤Intel HEX ⽂件。
记录 格式
Intel HEX 由任意数量的⼗六进制记录组成。每个记录包含5个域, 它们按以下格式排列:
:]cc
每⼀组字母对应⼀个不同的域,每⼀个字母对应⼀个⼗六进制编码的数字。每⼀个域由⾄少两个⼗六进制编码数字组成,它们构成⼀个字节,就像以下描述的那 样:
fprintf格式: 每个Intel HEX 记录 都由冒 号开头 .
ll 是 数 据 长 度域,它 代表 记录当 中 数 据字 节 (dd) 的 数量.
aaaa 是地址域, 它代表 记录当 中 数据的起始地址.
tt 是代表HEX 记录类型的域,它可能是以下数据当中的⼀ 个:
00 – 数据 记录
01 – ⽂件结束 记录
02 – 扩展段地址 记录
04 – 扩展线性地址 记录
dd 是数 据域,它代表⼀个字节的数据.⼀个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的 数字相符.
cc 是校验和域,它表⽰这个记录的校验和.校验和的计算是通过将记录当中所有⼗六进制编码数字对的值相加,以256为模进⾏以下补⾜.
表⽰为:“:[1字节长度][4字节地址][1字节记录类型][数据段][校验和] ”
数据 记录
Intel HEX⽂件由任意数量以回车换⾏符结束的数据记录组成.数据记录外 观如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10 是这个记录当中数据字节的 数量.即0x10
2462 是数据将被下载到存储器 当中的地址.即0x2462
00 是记录类型(数据 记录).即0x00
464C…464C是 数据.分别代表
33 是这个记录的校 验和.即0x33
扩展线性地址 记录(HEX386)
扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的⾼16位.扩展线性地址记录总是有两个数据字节,外 观如下:
:02000004FFFFFC
其中:
02 是这个记录当中数据字节的 数量.
0000 是地址域, 对于扩展线性地址记录,这个域 总是0000.
04 是记录类型 04(扩展线性地址 记录)
FFFF 是地址的⾼16 位.
FC 是这个记录的校验和,计算⽅法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
当⼀个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应⽤于从Intel HEX⽂件读取来的随后的记录.线性地址保持有效,直到它被另外⼀个扩展地址记录所改 变.
通过把记录当中的地址域与被移位的来⾃扩展线性地址记录的地址数据相加获得数据记录的绝对存 储器地址.
以下的例⼦演⽰了这个过 程..
来⾃数据 记录地址域的地址                      2462
扩展线性地址记录的 数据域                      + FFFF
------------
绝对存储器地址                              FFFF2462
扩展段地址 记录(HEX86)
扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记录总是有两个数据字节,外 观如下:
:020*********EA
其中:
02 是记录当中数据字节的 数量.
0000 是地址域. 对于扩展段地址记录,这个域 总是0000.
02 是记录类型 02(扩展段地址 记录)
1200 是地址段.
EA 是这个记录的校验和,计算⽅法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
当⼀个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应⽤于从Intel HEX⽂件读取来的随后的记录.段地址保持有效,直到它被另外⼀个扩展地址记录所改 变.
通过把记录当中的地址域与被移位的来⾃扩展段地址记录的地址数据相加获得数据记录的绝对存 储器地址.
以下的例⼦演⽰了这个过 程..
来⾃数据 记录地址域的地址                            2462
扩展段地址 记录数据域                      +  1200
---------
绝对存储器地址                    00014462
⽂件结束(EOF)记录
Intel HEX⽂件必须以⽂件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外 观总是如下:
:00000001FF
其中:
00 是记录当中数据字节的 数量.
0000 是数据被下载到存储器当中的地址.在⽂件结束记录当中地址是没有意 义被忽略的.0000h 是典型的地址.
01 是记录类型 01(⽂件结束 记录)
FF 是这个记录的校验和,计算⽅法如下:
01h + NOT(00h + 00h + 00h + 01h).
Intel HEX ⽂件例⼦:
下⾯是⼀个完整的Intel HEX⽂件的例⼦:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244 :10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016 :04003F00A42EFE22CB
:00000001FF
//追加⼀段
//-------------贴⼀段解析的c语⾔,这才是精华-------------------
char *path,int line)
{
unsigned int
nbytes=0,addr=0,type
=0,i,val,line_chksum;
unsigned char
data[1024];
unsigned char cksum;
const char *s=buf;
if(*s!=':') //第⼀个为冒
{
fprintf(stderr,"%s:%s:
format violation
(1)/n",path,line);
return(1);
}
++s;
//接下来的8个字节为数
据⼤⼩、地址等
if(sscanf(s,"%02x%0
4x%02x",&nbytes,&ad
dr,&type)!=3)
{
fprintf(stderr,"%s:%s:
format violation
(2)/n",path,line);
return(1);
}
s+=8;
//读到的类型
if(type==0) //为数据段
{
if(!(nbytes>=0 &&
nbytes<1024))
{
perror("nbyte per
line unsupport/n");
return(-1);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。