HEX文件以行为单位,每行以字符‘:’(0x3a)开头,以回车换行符0x0d, 0x0a为结束。每行开始和结束之间的所有内容,都是以字符形式表现的。例如数据0x1A,转换到HEX格式的行里面就是0x31 0x41。如果数据是16bit的,例如地址,则先显示高位,后显示底位。例如 0x1234,转换成HEX格式文件后变成 0x31 0x32 0x33 0x34,显示出来以后就是1234。将数据部分内容每2个字符看做一个字节得HEX数据,
例如::020000040000FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA
第一个 0x02 为数据长度。
紧跟着后面的0x00 0x00 为地址。
再后面的0x04为数据类型,类型共分以下几类:
'00' Data Record
'01' End of File Record
'02' Extended SegmentAddress Record
'03' Start Segment AddressRecord
'04' Extended LinearAddress Record
'05' Start Linear AddressRecord
然后,接着0x04后面的两个 0x000x00就是数据。最后一个0xFA是校验码。
HEX文件的每一行都是这样的格式
<0x3a> |
[数据长度1Byte] |
[数据地址2Byte] |
[数据类型1Byte] |
[数据nByte] |
[校验1Byte] |
<0x0d> |
<0x0a> |
例如::1000000018F09FE518F09FE518F09FE518F09FE5C0按照上面的数据行格式分析如下:
<0x3a> |
|
[数据长度1Byte] | 10 |
[数据地址2Byte] | 00 00 |
[数据类型1Byte] | 00 |
[数据nByte] | 18F09FE518F09FE518F09FE518F09FE5 |
[校验1Byte] | C0 |
<0x0d> |
|
<0x0a> |
|
每行中的数据并不是一定有的,第二个字节数据长度为0,那么这行就没有数据。由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended LinearAddress Record。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。例如:
:020000040004F6
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x0004,第二行是Data Record,里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为 (0x0004 << 16) | 0x0000,也就是写入FLASH的0x40000这个地址。同样,第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过64k的时候,文件中就会出现多个Extended Linear AddressRecord。
End of File Record 行是每一个HEX文件的最后一行。例如::00000001FF
这样的一行数据内容是固定的,数据长度为0,地址为0。
校验值:每一行的最后一个值为此行数据的校验和。例如:
:1000000018F09FE518F09FE518F09FE518F09FE5C0 这行中的 0xC0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D 这行中的 0x1D
校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。