您的位置:首页 > 其它

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语言,这才是精华-------------------

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: