本文对hex文件格式进行解析,介绍各部分组成及其含义,在此mark下,方便后续开发脚本对hex文件进行操作。
1. hex文件格式
Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据[百度百科]。
Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:
:llaaaatt[dd…]cc
从“:”后依次为数据长度、地址、数据类型、数据内容及CRC校验值信息。
1.1 数据长度
ll 是数据长度域,代表记录当中数据字节(dd)的数量。
在上图红圈②中,即表示有16个Byte的数据长度。
1.2 地址域
aaaa 是地址域,代表记录当中数据的起始地址。
需要注意需要在扩展线性地址基础上偏移后才是最终的地址。
1.3 数据类型
tt 是代表HEX记录类型的域,可能是以下数据当中的一个:
类型 | 含义 |
---|---|
00 | 数据记录,即本行携带的有数据信息 |
01 | 文件结束记录,在hex文件的末尾出现 |
02 | 扩展段地址记录 |
03 | 起始段地址标识 |
04 | 扩展线性地址记录,后续的地址需在此基础上偏移,直到遇到下一个扩展线性地址记录 |
05 | 开始线性地址记录(Start Linear Address Record) |
当出现数据类型为“02”及“04”时,需要进行地址偏移,直到出现一个新的段地址或者线性地址,再重新变更偏移地址。
数据实际物理地址为:线性地址左移16位+段地址左移4位+偏移地址。
地址计算示例:
:02000004010BEA 线性偏移地址:0x010B
:020000021FFFBD 扩展段地址:0x1FFF
:0401000090FFAA5502 数据地址:0x0100
基地址:010B左移16位,0x010B0000;
扩展段地址:1FFF左移4位,0x0001FFF0;
数据偏移地址:0x0100;
实际物理地址=基地址+扩展段地址+偏移地址=0x010D00F0。
1.4 数据域
dd 是数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符。
1.5 CRC校验域
cc 是校验和域,表示这个记录的校验和。
校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。
计算示例:
在上图中第二行CRC前所有数据的和:
0x10+0xEF+0x80+0xA5+0xA5+0xA5+0xA5+0x01 = 0x414 = 1044
checksum = 256 - sum_of_hex % 256 = 236 =0xEC