hex文件格式详解

这篇具有很好参考价值的文章主要介绍了hex文件格式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是hex文件

以*.hex为后缀的文件我们称之为HEX文件。hex是intel规定的标准,hex的全称是Intel HEX,此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。
HEX的英语原始意思是16进制。这种文件格式主要用于保存单片机固件。
整个文件以行为单位,每行以冒号开头,内容全部为16进制码,2个ASCII码字符表示1个Hex字节

hex文件格式

先上图:这是我用Notepad++ 直接打开的一个32bit的单片机编译器编译的一个hex文件(中间省略了部分):
hex文件解析,STM32初学,mcu,嵌入式
通过上面的文件,我们不难发现,hex文件每行都由一个冒号:作为起始码。
每行都符合以下图示的格式:
(注意:下图中一格代表一个ASC码,用一个字节表示)
hex文件解析,STM32初学,mcu,嵌入式起始码:每行数据作为一帧,并由:作为起始码;

字节长度:两个十六进制数字(一对十六进制数字),指示数据字段中的字节数(十六进制数字对)。最大字节数为255(0xFF)。16(0x10)和32(0x20)是常用的字节数;

地址:四个十六进制数字,代表数据的16位起始存储器地址偏移量。数据的物理地址是通过将此偏移量添加到先前建立的基地址来计算的,因此允许内存寻址超过16位地址的64 KB限制。基地址默认为零,可以通过各种类型的记录进行更改。基地址和地址偏移量始终表示为大端值。

指令类型:两个十六进制数字00到05,定义了这行数据的具体含义;

数据类型 作用
‘00’ Data Rrecord 用来记录数据,HEX文件的大部分记录都是数据记录
‘01’ End of File Record 用来标识文件结束,放在文件的最后,标识HEX文件的结尾。数据字段为空(因此字节数为00),并且地址字段通常为 0000。
‘02’ Extended Segment Address Record 用来标识扩展段地址的记录,数据字段包含一个16位的段基址(因此字节数始终为02)与80x86实模式寻址兼容。地址字段(通常为0000)被忽略。最近的段地址02记录乘以16,然后加到每个后续数据记录地址,以形成数据的物理起始地址。这允许寻址多达1 MB的地址空间。
‘03’ Start Segment Address Record 开始段地址记录,对于80x86处理器,请指定CS:IP寄存器的初始内容(即起始执行地址)。地址字段是0000,字节数始终为04,前两个数据字节是CS值,后两个是IP值。
‘04’ Extended Linear Address Record 用来标识扩展线性地址的记录,允许32位寻址(最大4GiB)。记录的地址字段将被忽略(通常是0000),其字节数始终为02。两个数据字节(大字节序)为所有后续类型指定32位绝对地址的高16位00记录; 这些高位地址位适用于下一个04记录。类型的绝对地址00 通过组合最近的高16位地址位形成记录 04 用低16位的地址记录 00记录。如果是类型00 记录之前没有任何类型 04 记录,然后其高16位地址位默认为0000。
‘05’ Start Linear Address Record 开始线性地址记录,地址字段是 0000(未使用),字节数始终为04。四个数据字节代表一个32位地址值(big-endian)。对于80386和更高版本的CPU,此地址将加载到EIP寄存器中。

数据:n字节数据序列,由2个n十六进制数字表示;

校验码:(两个十六进制数字),可以用来验证记录没有错误的计算值;
注意校验和算法:累加和=校验码之前所有16进制,校验和=0x100-累加和。

如之前的hex文件图
第一行020000040804EE中,可以看做是0x02 0x00 0x00 0x04 0x08 0x04 0xEE,
02:代表本行有2个字节数据
0000:表示偏移地址或无用填0
04:扩展线性地址标识,表面后面2个字节数据是后面数据的基地址
注:由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,故有了扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录含数据的高16位,扩展线性地址记录总是有两个数据字节。
0804:是扩展地址 (0x0804 << 16) = 0x08040000后面的数据记录都以这个地址为基地址。
EE: 记录本行校验和 EE=0x100-(0x02+0x04+0x08+0x04)

第二行也按格式切分开为 10 0000 00 A8990020C1010408830B040839080408 DA
10:本行有0x10个Byte数据(即16个Byte数据)
0000:表示本行数据起始地址为0x08040000。下一行则是0x08040010依次类推
00:数据类型,表示后面字节为记录的数据
A8990020C1010408830B040839080408:16个byte的数据
DA: 校验和
00类型的行都大差不差,只是地址和数据不同而已,就不多赘述,以此类推即可。

倒数第二行也按格式切分开为 04 0000 05 080401AD 3D
04:表示本行有4个Byte数据
0000:无用填0
05:数据类型,表示开始线性地址记录
080401AD:表示要执行的下一个指令的地址(main函数地址)
3D:校验和

位置只有四个数据,但是 标注类型是 05, 即他是一个 “开始线性地址记录”。
说那么多,什么是开始线性地址记录呢?其实他就是函数入口地址
例如在该工程的 .map 文件中可以看到以下信息

Memory Map of the image

Image Entry point : 0x080401AD

但该行对于普通的MCU烧写程序来说没有什么作用,参考以下资料:
05 类型: Start Linear Address Record. The address field is 0000, the byte count is 04. The 4 data
bytes represent the 32-bit value loaded into the EIP register of the 80386 and higher CPU.

最后一行 00000001FF
00:代表本行有0个字节数据
0000:无用填0
01:标识hex文件结束
FF:校验和
注:每一个hex文件都以这个结尾。

hex文件和bin文件有什么不同

从几个方面来看待它们的不同。
1、格式的不同
HEX文件格式,看文章前一节已经详细讲解了。
BIN文件格式,对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。
Bin文件是MCU固件烧写的最终形式,也就是说芯片ROM中烧写的内容完全就是Bin文件的内容。

2、使用的不同
HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身。在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定烧录的起始地址信息的。

3、HEX文件和BIN文件大小的区别
HEX文件是用ASCII来表示二进制的数值。例如一般8BIT的二进制数值0x3F,用ASCII来表示就需要分别表示字符’3’和字符’F’,每个字符需要一个BYTE,所以对比同一个工程编译出来的HEX文件和BIN文件,HEX文件至少是BIN文件大小的两倍以上。
hex文件解析,STM32初学,mcu,嵌入式
hex文件解析,STM32初学,mcu,嵌入式
上面两张图分别以文本形式查看一个hex文件,以及使用十六进制形式查看该hex文件,可以更明显得看出:
hex文件是以ASCII码形式保存下来的。比如0x3a对应字符’:',0x30 0x32 0x30 0x30 对应字符0200,并且每行的末尾用了0D 0A进行回车换行。

对一个BIN文件而言,你查看文件的大小就可以知道文件包括的数据的实际大小。而对HEX文件而言,你看到的文件大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息。

4、Hex文件和Bin文件的存在价值
从上面的介绍中,我们发现Hex文件中每行的内容,有开始行,有结束行,并且每行还有校验码。我们得出hex文件的两个优点:

  1. 使用ASCII文本保存固件信息,方便查看一些固件内容;
  2. 通过文件每行的校验和与最后一行的文件结束标志,在文件的传输与保存过程中能够发现固件是否完整。

Hex文件有更好的可读性,最重要的是hex文件能够保证固件在保存与传输时的完整性。因此hex文件更适用于保存与传输。而Bin文件是纯二进制文件,内部只包含程序编译后的机器码和变量数据。当文件损坏时,我们也无法知道文件已损坏。不过Bin文件作为固件的最终形式,在使用串口下载程序或者远程升级时,是不可替代的,因为bin文件相对hex文件更小巧。

小知识

稍微高一些的版本的Notepad++才能在打开hex文件时有彩色区分数据段,如果你的Notepad++打开hex文件没有颜色,那么很可能是版本比较低。
通常打开hex文件后会自动识别为hex文件,查看语言可以看到是自动识别了Intel HEX(前面提过了,HEX全称是Intel HEX)
hex文件解析,STM32初学,mcu,嵌入式
正常情况下,校验码都是正确的,校验码部分会显示绿色
hex文件解析,STM32初学,mcu,嵌入式
如果有校验码出错,Notepad++会显示成黄色
hex文件解析,STM32初学,mcu,嵌入式文章来源地址https://www.toymoban.com/news/detail-777356.html

到了这里,关于hex文件格式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 MCU ADC详解(1)--初识ADC

    ADC中文全称 模拟数字转换器 ,其主要功能是将模拟信号(通常是连续变化的电压/电流信号)转换成数字信号,提供给程序进行处理。这个转换有什么作用呢?举个例子,当我们在淋浴的时候,感觉到水温过高了,会伸手对开关进行一个调节,这是因为我们大脑对皮肤神经末

    2024年01月23日
    浏览(37)
  • SL651-2014全协议解析(HEX编码格式)

    SL651-2014协议解析 转载请注明来源

    2024年02月10日
    浏览(39)
  • STM32 MCU 定时器详解(1)--基本定时器

    定时器是一种电子组件,主要用于定时控制,具备精确计时的能力。它可以在设定的时间间隔内触发特定的操作,如发送数据、采集传感器信息、检测输入信号或产生规律性输出波形。这种灵活性使定时器在多个行业中得到广泛应用,支持各种复杂功能的实现,是现代电子系

    2024年02月22日
    浏览(49)
  • STM32 MCU 定时器详解(3)--高级定时器

    16位递增、递减、中心对齐计数器(计数值:0~65535) 16位预分频器(分频系数:1~65536) 可用于触发DAC、ADC 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式 使用外部信号控制定时器且可实

    2024年04月17日
    浏览(45)
  • 【嵌入式烧录/刷写文件】-3.2-S19/Hex文件转换为Bin文件

    案例背景(共6页精讲) : 该篇将告诉您:如何使用Vector HexView工具,对一个 Intel Hex 或 Motorola S-record ( S19 / SREC / mot / SX )文件转换为 bin 文件。 目录 1 Intel Hex,Motorola S-record(S19/SREC/mot/SX),Bin文件之间的差异/区别 2 使用Vector HexView工具实现:Intel Hex或Motorola S-record(S19/SREC/mot/SX)文件

    2024年02月06日
    浏览(92)
  • Xilinx Bit文件格式详解及嵌入式应用

    Bit文件是Xilinx FPGA(可编程逻辑门阵列)设备上的配置文件,用于定义硬件逻辑和电路的功能。本文将详细介绍Xilinx Bit文件的格式以及在嵌入式系统中的应用。 一、Bit文件格式 Bit文件是一种二进制文件,包含了FPGA设备的配置信息。它由多个不同类型的数据块组成,每个数据

    2024年02月02日
    浏览(46)
  • STM32串口通信详解(嵌入式学习)

    时钟信号在电子领域中是指用于同步和定时电路操作的周期性信号。它在数字系统和通信系统中起着至关重要的作用,用于协调各个组件之间的数据传输和操作。 时钟信号有以下几个重要的方面: 频率:时钟信号的频率是指单位时间内信号周期的数量。它通常以赫兹(Hz)为

    2024年02月09日
    浏览(67)
  • 【嵌入式烧录/刷写文件】-3.1-详解二进制Bin格式文件

    目录 1 什么是bin 2 bin文件的结构 3 如何打开bin文件 3.1 使用Vector HexView工具打开 3.2 使用Notepad++工具打开 3.3 使用Binary Viewer工具打开 结尾 优质博文推荐阅读(单击下方链接,即可跳转): 点击返回「《Autosar从入门到精通-实战篇》总目录」 点击返回「《Autosar_BSW高阶配置》总

    2024年02月08日
    浏览(54)
  • STM32的中断系统详解(嵌入式学习)

    中断是处理器中的一种机制,用于响应和处理突发事件或紧急事件。当发生中断时,当前正在执行的程序会被暂时中止,处理器会跳转到中断处理程序(也称为中断服务例程),对中断事件进行处理。处理完中断后,处理器再返回到被中断的程序继续执行。 中断可以分为内部

    2024年02月12日
    浏览(69)
  • STM32的定时器详解(嵌入式学习)

    想要了解STM32的时钟系统 点击这里跳转——》STM32的时钟系统(嵌入式学习) 建议先看看时钟树如何配置 点击这里跳转——》STM32的时钟树配置(嵌入式学习) 跳转——》STM32的时钟基础详解(嵌入式学习) 跳跳转——》STM32的时钟源详解(嵌入式学习) SysTick又称滴答定时

    2024年02月13日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包