日志档案

发表于 2007-12-13 22:06:33

3

标签: HEX  

HEX格式内容含义

HEX文件格式是我们经常遇到的一种文件格式,因为几乎所有的编程烧录文件都为HEX格式。

首先,HEX文件中是包含了地址信息的。这和BIN文件不同,BIN文件中只包含了数据信息。所以我们在烧写或者下载HEX文件的时候,一般不需要我们指定地址,但是在烧写BIN文件的时候,用户是一定要指定地址信息的。

二、HEX文件都是由记录组成的。它的每一行都是一个记录来的。它是由任意数量的十六进制数组成。每个记录包含五个域,它们以以下格式排列的:

aabbbbcc[dd…]ee

上面每一组不同的字母代表不同的一个域,每个字母代表一个十六进制的数字,每一个域至少由两个十六进制编码数字组成,每两个十六进制编码数字组成一个字节。具体描述如下:

1、  每个HEX记录都由冒号开头;

2、  aa表示这个记录中的数据长度域,它代表记录当中数据字节[dd…]的字节数量。

3、  bbbb是地址域,它代表记录当中数据的起始地址。

4、  cc 是代表HEX记录类型的域,它可能是以下数据当中的一个:
00 –
数据记录
01 –
文件结束记录
02 –
扩展段地址记录
04 –
扩展线性地址记录

5、  dd 是数据域,它代表一个字节的数据,一个记录可以有许多数据字节。记录当中数据字节的数量必须和数据长度域(aa)中指定的数字相符。

6、  ee 是校验和域,它表示这个记录的校验和。校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。

比如:前面AduC7026LED实验中的HEX文件内容为:

:020000040008F2                              。。。。。。。。。。。。。。。。。。。  1

:1000000018F09FE518F09FE518F09FE518F09FE5C0  。。。。。。。。。。。。。。。。。。。  2

:1000100018F09FE50000A0E118F09FE518F09FE5BB

:100020004000080074030800700308006C03080017

:100030006803080000000000640308006003080073

:1000400078009FE50110A0E3041480E50110A0E30F

:10005000081480E5F410A0E30C1480E560009FE52F

:10006000DBF021E300D0A0E1040040E2D7F021E37F

:1000700000D0A0E1040040E2D1F021E300D0A0E1F3

:10008000040040E2D2F021E300D0A0E1800040E291

:10009000D3F021E300D0A0E1040040E210F021E31E

:1000A00000D0A0E11C009FE5010010E318E09F05CF

:1000B00018E09F1510FF2FE1FEFFFFEAFEE7C046A4

:1000C0000000FFFF900401003D010800B800080097

:1000D000BD0008000000000000000000000000005B

:1000E00000000000AA2108480160012107480160C2

:1000F0005522074802600748016000210648016058

:10010000F4210648016070471004FFFF1404FFFF4C

:100110001804FFFF0404FFFF0804FFFF0C04FFFFA7

:1001200004E005490A1C0139002AFBD1011C0138F1

:100130000029F6D17047C046E8030000664806C8AB

:100140000B1C134305D000230B70491C9142FBD1BB

:10015000F5E76248C01C0323984306C80B1C1343F1

:1001600006D00378401C0B70491C9142F9D1F1E78D

:1001700000B5FFF7B7FFF0235948016899430160C4

:10018000584A59480168114301600F2457480168D3

:10019000A1430160564C5748016821430160534810

:1001A0000168994301605348016811430160524A54

:1001B0004E48016891430160504A4E48016811431E

:1001C00001604F4A49480168914301604D4A4948DE

:1001D0000168114301604C4A4C4801689143016039

:1001E0004B4A4C480168114301604B4A474801683B

:1001F00091430160494A4748016811430160484AF8

:100200004248016891430160464A424801681143EF

:1002100001604549454801604548FFF781FF454970

:10022000454801604248FFF77BFF3F494248016073

:100230003F48FFF775FF41493F4801603C48FFF7E1

:100240006FFF3F493C4801603948FFF769FF3D496E

:100250003D4801603648FFF763FF3C493A4801607A

:100260003348FFF75DFF3A49374801603048FFF7F0

:1002700057FF2D49374801602D48FFF751FF2D49A1

:10028000354801602A48FFF74BFF27493248016093

:100290002748FFF745FF29492F4801602448FFF709

:1002A0003FFF27492C4801602148FFF739FF2549C6

:1002B0002A4801601E48FFF733FF244927480160A0

:1002C0001B48FFF72DFF2249244801601848FFF71B

:1002D00027FF9EE700BDC046D4000800DC000800F0

:1002E00000F4FFFF0000000220F4FFFF0CF4FFFF0A

:1002F0000000000150F4FFFF000F000000000004A8

:1003000000F000000000000800000F0008F4FFFFEC

:100310000000001040F4FFFF0000F000000000208B

:100320000000000F000000400000020024F4FFFF66

:100330002C0100000000010054F4FFFF0000040045

:10034000000008000000100044F4FFFF000020003F

:100350000000400028F4FFFF58F4FFFF48F4FFFFBF

:10036000FEFFFFEAFEFFFFEAFEFFFFEAFEFFFFEAF5

:08037000FEFFFFEAFEFFFFEAB9

:00000001FF

它的第二行为::1000000018F09FE518F09FE518F09FE518F09FE5C0容易知道:

它的ee为:C0,计算过程如下:

C0=0x01+ not(0x10+0x00+0x00+0x00+0x18+0xF0+…+0xE5)

文件结束(EOF)记录
Intel HEX
文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下:
:00000001FF
其中:
00
是记录当中数据字节的数量。
0000
是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的。0000h是典型的地址。
01
是记录类型 01(文件结束记录)
FF
是这个记录的校验和,计算方法如下:
01h + NOT(00h + 00h + 00h + 01h).

扩展线性地址记录(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




系统分类: 单片机   |   用户分类: ARM/linux   |   来源: 原创   |   【推荐给朋友】

    阅读(619)    回复(1)  

投一票您将和博主都有获奖机会!