HEX文件格式,ihex,hex解析
2009-12-29 16:05
225 查看
来自:http://blog.csdn.net/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
个
域,
它们按以下格式排列:
:llaaaatt[dd...]cc
每一组字母
对应
一
个
不同的域,每一
个
字母
对应
一
个
十六
进
制
编码
的
数
字。每一
个
域由至少
两个
十六
进
制
编码数
字
组
成,
它们构
成一
个
字
节
,就像以下描述的那
样:
:
每个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是
数据.分别代表0x46,0x4C...
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
位
数
据地址段.
扩
展段地址
记录总
是有
两个数
据字
节
,
外
观如下:
:020000021200EA
其中:
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语言,这才是精华-------------------
Intel HEX
文件是由一行行符合Intel HEX
文件格式的文本所
构
成的ASCII
文本文件。在Intel HEX
文件中,每一行包含一
个
HEX
记录
。
这
些
记录
由
对应
机器
语
言
码
和/
或常量
数
据的十六
进
制
编码数
字
组
成。Intel HEX
文件通常用于
传输将
被存于ROM
或者EPROM
中的程序和
数
据。大多
数
EPROM
编
程器或模
拟器使用Intel HEX
文件。
记录
格式
Intel HEX
由任意数量的十六
进
制
记录组
成。每
个记录
包含5
个
域,
它们按以下格式排列:
:llaaaatt[dd...]cc
每一组字母
对应
一
个
不同的域,每一
个
字母
对应
一
个
十六
进
制
编码
的
数
字。每一
个
域由至少
两个
十六
进
制
编码数
字
组
成,
它们构
成一
个
字
节
,就像以下描述的那
样:
:
每个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是
数据.分别代表0x46,0x4C...
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
位
数
据地址段.
扩
展段地址
记录总
是有
两个数
据字
节
,
外
观如下:
:020000021200EA
其中:
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语言,这才是精华-------------------
int ParseIHexPerLine(const char *buf,const 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%04x%02x",&nbytes,&addr,&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); } cksum=nbytes+addr+(addr>>8)+type; // for(i=0; i<nbytes; i++) { val=0; if(sscanf(s,"%02x",&val)!=1) { fprintf(stderr,"%s:%s: format violation (3)/n",path,line); return(1); } s+=2; data[i]=val; cksum+=val; } // line_chksum=0; if(sscanf(s,"%02x",&line_chksum)!=1) { fprintf(stderr,"%s:%s: format violation (4)/n",path,line); return(1); } if((cksum+line_chksum)&0xff) { fprintf(stderr,"%s:%s: checksum mismatch (%u/%u)/n", cksum,line_chksum); return(1); } if(WriteRAM(addr,data,nbytes)) return(1); } else if(type==1) { // EOF marker. Oh well, trust it. return(-1); } else { fprintf(stderr,"%s:%s: Unknown entry type %d/n",type); return(1); } return(0); }
相关文章推荐
- 转载 : HEX文件格式,ihex,hex解析(这个应该是准确的描述)
- 转载 : HEX文件格式,ihex,hex解析(这个应该是准确的描述)
- HexDump.java解析
- Hex文件格式解析
- 关于intel 32 hex文件格式以及hex2rom.sed
- HexDump.java解析
- Hex文件格式解析
- Java bytesToHexString 解析
- Intel HEX 格式解析
- Hex文件格式解析
- HEX文件格式解析
- HexDump.java解析,android 16进制转换
- 转载_Hex文件格式解析
- Hex文件格式解析
- Keil L51 输出的hex文件格式为Hex-80
- 解析Intel Hex(16bit)文件并自动读入到MCU软核ROM中的Verilog程序
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Pet Shop 4.0 个人版 解析
- 由JSON解析想到的
- IP包头部格式解析