Hex文件如果用特殊的程序来查看( notepad++)。打开后可发现,真个文件以行为单位,每行以冒号开头,内容全部为16进制码。Hex文件可以按照如下的方式进行拆分来分析其中的内容:
hex文件每一行的数据格式为:
| 冒号 | 数据长度 | 存储地址 | 数据类型 | 数据内容 | 校验值 |
|---|---|---|---|---|---|
| 1字节 | 2字节 | 1字节 | n字节 | 1字节 |
接下来我们以“:020000040001f9”分析它们数据格式之间的关系
1、冒号
冒号对于文件本身来说没有参考意义,有兴趣的可以去研究相关资料
2、数据长度
如图所示
该列都代表数据长度,即该行数据内容的长度值
所以第一行的数据内容长度为2字节,第2行数据内容的长度为10字节,以此类推
3、存储地址
上图红色框中的都是表示数据内容在flash中的存储地址,由于存储地址只占有2个字节所以最大只能到64K,显然,对于超过64K的数据就不能编码存储地址,因此为了可以保存高地址的数据,就有了Extended Linear Address Record(下面的数据类型会讲解)。如果这行的数据类型是0x04,那么,这行的数据内容就是随后数据的基地址。
存储地址 分为偏移地址和绝对地址
也就是说hex文件中存储地址位存储的可能是偏移地址也可能是绝对地址
如何判断是偏移地址还是绝对地址?
一般从打开的hex文件整体格式来说主要取决于第一行的代码
如果看到数据类型位的值是“04”那么04后面的数据内容则为存储后面数据的基地址,例如:
那么实际数据的存储地址:(基地址<<16) | 偏移地址
那么第二行数据内容的存储地址我们可以得出:
address: (0x0001 << 16) | 0xc000 = 0x0001c000;
所以第二行数据内容的实际存储地址为:0x0001c000;
如果第一行没有04类型的数据则一般存储地址位则保存绝对地址,例如:
可知第一行数据内容的存储地址为:0x0000; 第二行数据内容存储地址为:0x0020;
4、数据类型
数据类型共分为以下几类:
| 数据类型 | 英文解释 | 中文解释 |
|---|---|---|
| 00 | Data Record | 该类型后面的值为数据内容 |
| 01 | End of File Record | 该类型后面的值为文件结束标志 |
| 02 | Extended Segment Address Record | 该类型后面的值为扩展段地址 |
| 03 | Start Segment Address Record | 该类型后面的值为开始段地址 |
| 04 | Extended Linear Address Record | 该类型后面的值为扩展线性地址 |
| 05 | Start Linear Address Record | 该类型后面的值为开始线性地址 |
5、数据内容
数据内容没什么好说的就是flash实际存储的数据
以上红框中都为数据内容
6、校验值
从hex文件格式可知每1行都有校验值,每一行的最后一个字节都为校验值校验值计算方法:
0x100 - (该行数据所有的数据的累加和%256)
例如::020000040001F9
0x100 - ((0x02+0x00+0x00+0x04+0x00+0x01)%256) = 0xf9