hex文件格式详解 📅 2026/7/18 9:52:21 什么是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文件每行都由一个冒号:作为起始码。每行都符合以下图示的格式注意下图中一格代表一个ASC码用一个字节表示起始码每行数据作为一帧并由:作为起始码字节长度两个十六进制数字一对十六进制数字指示数据字段中的字节数十六进制数字对。最大字节数为2550xFF。160x10和320x20是常用的字节数地址四个十六进制数字代表数据的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处理器请指定CSIP寄存器的初始内容即起始执行地址。地址字段是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 0xEE02代表本行有2个字节数据0000表示偏移地址或无用填004扩展线性地址标识表面后面2个字节数据是后面数据的基地址注由于每行标识数据地址的只有2Byte所以最大只能到64K为了可以保存高地址的数据故有了扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录含数据的高16位扩展线性地址记录总是有两个数据字节。0804是扩展地址 (0x0804 16) 0x08040000后面的数据记录都以这个地址为基地址。EE: 记录本行校验和 EE0x100-(0x020x040x080x04)第二行也按格式切分开为 10 0000 00 A8990020C1010408830B040839080408 DA10本行有0x10个Byte数据即16个Byte数据0000表示本行数据起始地址为0x08040000。下一行则是0x08040010依次类推00数据类型表示后面字节为记录的数据A8990020C1010408830B04083908040816个byte的数据DA: 校验和00类型的行都大差不差只是地址和数据不同而已就不多赘述以此类推即可。倒数第二行也按格式切分开为 04 0000 05 080401AD 3D04表示本行有4个Byte数据0000无用填005数据类型表示开始线性地址记录080401AD表示要执行的下一个指令的地址main函数地址3D校验和位置只有四个数据但是 标注类型是 05, 即他是一个 “开始线性地址记录”。说那么多什么是开始线性地址记录呢其实他就是函数入口地址例如在该工程的 .map 文件中可以看到以下信息Memory Map of the imageImage Entry point : 0x080401AD…但该行对于普通的MCU烧写程序来说没有什么作用参考以下资料05 类型 Start Linear Address Record. The address field is 0000, the byte count is 04. The 4 databytes represent the 32-bit value loaded into the EIP register of the 80386 and higher CPU.最后一行00000001FF00代表本行有0个字节数据0000无用填001标识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文件以及使用十六进制形式查看该hex文件可以更明显得看出hex文件是以ASCII码形式保存下来的。比如0x3a对应字符’:0x30 0x32 0x30 0x30 对应字符0200并且每行的末尾用了0D 0A进行回车换行。对一个BIN文件而言你查看文件的大小就可以知道文件包括的数据的实际大小。而对HEX文件而言你看到的文件大小并不是实际的数据的大小。一是因为HEX文件是用ASCII来表示数据二是因为HEX文件本身还包括别的附加信息。4、Hex文件和Bin文件的存在价值从上面的介绍中我们发现Hex文件中每行的内容有开始行有结束行并且每行还有校验码。我们得出hex文件的两个优点使用ASCII文本保存固件信息方便查看一些固件内容通过文件每行的校验和与最后一行的文件结束标志在文件的传输与保存过程中能够发现固件是否完整。Hex文件有更好的可读性最重要的是hex文件能够保证固件在保存与传输时的完整性。因此hex文件更适用于保存与传输。而Bin文件是纯二进制文件内部只包含程序编译后的机器码和变量数据。当文件损坏时我们也无法知道文件已损坏。不过Bin文件作为固件的最终形式在使用串口下载程序或者远程升级时是不可替代的因为bin文件相对hex文件更小巧。小知识稍微高一些的版本的Notepad才能在打开hex文件时有彩色区分数据段如果你的Notepad打开hex文件没有颜色那么很可能是版本比较低。通常打开hex文件后会自动识别为hex文件查看语言可以看到是自动识别了Intel HEX前面提过了HEX全称是Intel HEX正常情况下校验码都是正确的校验码部分会显示绿色如果有校验码出错Notepad会显示成黄色