行业资讯
📅 2026/7/10 21:52:18
一文带你搞懂Hex文件
一文带你搞懂Hex文件Intel HEX上一篇文章讲了 S19 文件本文继续聊另一种常见的十六进制格式——Intel HEX简称 Hex。同样是在 UDS 刷写中打交道最多的文件格式之一。感兴趣的可以直接移步上一篇一文带你搞懂S19文件一、概述Hex 文件是 Intel 公司定义的一种按地址排列的数据格式数据宽度为字节所有数据用十六进制数字表示以ASCII码形式按行存储。每一行以冒号:开头表明一条记录的开始。它和 S19 的本质区别就两点起始符不同:vsS字段排列顺序不同。除此之外的思想完全一致——都是文本格式的二进制数据 地址 校验。说起来也挺有意思——嵌入式世界的大端小端之争是 Intel 和 Motorola 搞出来的结果到了程序文件格式这儿又是这俩公司各自搞了一套Intel 搞了 HEXMotorola 搞了 S-Record。两家巨头从字节序打到文件格式谁也不服谁倒是给我们写底层工具的人留下了不少兼容适配的活。二、Hex 文件示例先用一个真实的 Hex 文件片段感受一下020000041001E9100000000000020895090310D918031059090310BC10001000DD180310E1180310E518031031313031F910002000000000000000000000000000391103107310003000E918031000000000ED180310F1180310781000400067F802108DF80210B3F80210D9F802100810005000FFF8021025F902104BF9021071F9021095在VSCode中安装Hex Editor或Intel HEX format插件可以高亮显示各字段方便快速查看每一个部分。如下图所示三、Hex 文件格式结构每条记录的结构固定以冒号:打头后面跟着五段信息BB AAAA TT HHHHHHHH… CC用颜色标注如下以上面第二行为例10 0000 00 0000020895090310D918031059090310 BC字段颜色含义本例起始符—固定::数据长度Byte Count 蓝本行数据字节的个数HH的个数10 16 字节地址Address 绿数据起始地址2 字节根据记录类型不同可能有不同的含义0000 0x0000记录类型Record Type 红本行记录类型包含5个种类不同种类包含不同数据00 数据记录数据Data 橙实际数据长度由数据长度字段决定00000208950903…校验和Checksum 紫校验和 0x100 - 前面字节累加和(溢出byte部分不计)BC下边我会详细展开讲每一个字段。四、Hex 行字段说明数据长度Byte Count1字节十六进制数表示本行数据字段(橙色字节)的字节数。注意不包括地址和记录类型字段。以 : 10 0000 00 0000020895090310D918031059090310 BC 为例0x10 16表示后面跟了 16 个字节的数据。地址Address2字节十六进制数表示本条数据的偏移地址16 位范围0x0000 ~ 0xFFFF。例如 : 100000000000020895090310D918031059090310BC 中的 0000 。根据记录类型不同有不同含义。——后面会详细讲。记录类型Type以 : 100000000000020895090310D918031059090310BC 为例其中的红色部分 00 就是HEX文件的记录类型1字节十六进制数Hex 共有 6 种记录类型类型名称用途00数据记录Data Record(8-, 16-, or 32-bit formats)存实际数据最常见01文件结束End of File Record(8-, 16-, or 32-bit formats)标识文件结束后面没有数据了02扩展段地址Extended Segment Address Record(16-or 32-bit formats)基地址 数据值 403起始段地址Start Segment Address Record(16-or 32-bit formats)指定程序起始段地址极少用网上关于该记录类型的描述很少具体作用不详04扩展线性地址Extended Linear Address Record(32-bit format only)基地址 数据值 16最常见扩展方式05起始线性地址Start Linear Address Record(32-bit format only)开始线性地址记录即:程序入口地址(程序入口地址未必是main函数地址)如复位向量下面逐个展开每一种类型。类型 00 —— 数据记录Data Record(8-, 16-, or 32-bit formats)Record Mark ‘:’Record LengthLoad OffsetRecord Type ‘00’DataChecksum1 Byte 固定为 ‘:’1 Byte2 Byte1 Byte 固定为 00N Byte1 Byte最常出现的一类后跟实际要烧录到 Flash 中的数据10 0010 00 DD180310E1180310E518031031313031 F91016 字节数据0010偏移地址 0x001000数据记录DD180310E1180310E51803103131303116 字节实际数据F9校验和类型 04 —— 扩展线性地址常见Record Mark ‘:’Record Length ‘02’Load Offset ‘0000’Record Type ‘04’Base AddressChecksum1 Byte 固定为 ‘:’1 Byte 固定为 022 Byte 固定为 00001 Byte 固定为 042 Byte 基地址1 Byte当程序地址超过 16 位大于0xFFFF时用这个类型声明高位基地址02 0000 04 1001 E9022 字节数据0000地址字段不用填 004记录类型为扩展线性地址100104的数据段专门表示基地址; 基地址数据 0x1001E9校验和这条记录的意思是后面所有数据记录的物理地址 0x1001 16 数据记录的偏移地址。✍ 地址计算规则这里就是hex文件和s19文件不同的地方s19文件一行数据本身就包括了全部的地址例如 S309000080040000812CC5中的00008004就是完整地址。而hex文件虽然一行数据也包含了地址但不是全部的地址例如: 1000000000000208…BC 的0000只是表示偏移地址也就是地址的低位。要想获取实际的地址则需要基地址左移N位后N根据记录类型有不同值再加上偏移地址得到实际地址。举例020000041001E9 ← 基地址 0x1001 16 0x10010000100000000000020895090310D918031059090310BC ← 偏移 0x0000那么这条数据记录的实际物理地址为 ( 0x1001 16 ) 0x0000 0x10010000在大端存储的处理器中内存布局如下内存地址数据0x100100000x000x100100010x000x100100020x020x100100030x08扩展段地址类型02同理只是偏移量为 4段地址左移 4 位。实际工程中类型04最常用。一旦出现新的类型04记录后续所有数据都改用新的基地址直到文件结束或再次遇到新的类型04。类型 05 —— 起始线性地址程序入口Record Mark ‘:’Record Length ‘04’Load Offset ‘0000’Record Type ‘05’EIPChecksum1 Byte 固定为 ‘:’1 Byte 固定为 042 Byte 固定为 00001 Byte 固定为 054 Byte1 Byte: 04 0000 05 00000000 F7044 字节数据05记录类型是起始线性地址00000000程序入口地址 0x00000000这个地址通常是 MCU 的复位向量地址由编译时链接脚本决定。注意主函数不一定是入口地址——芯片上电后首先跳到复位向量再通过启动代码跳转到main()。类型 01 —— 文件结束Record Mark ‘:’Record Length ‘00’Load Offset ‘0000’Record Type ‘01’Checksum ‘FF’1 Byte 固定为 ‘:’1 Byte 固定为 002 Byte 固定为 00001 Byte 固定为 011 Byte 固定为 FF每一份有效的 Hex 文件都必须以这一行结尾00 0000 01 FF00数据长度为 0没有数据01记录类型为文件结束标识FF因为数据是固定的所以校验和固定 0x100 - 0x01 0xFF校验和Checksum校验和方法将冒号:之后的所有字节数据长度 地址 记录类型 所有数据字节 校验和本身以单字节累加和应为0x00模 256溢出部分不计。反算校验位的方法校验和 0x100 - (数据长度 地址 记录类型 所有数据字节) 的低 8 位验证上面那行 : 100000000000020895090310D918031059090310BC累加除冒号外所有字节10 00 00 00 00 00 02 08 95 09 03 10 D9 18 03 10 59 09 03 10 BC求和 0x300十六进制低 8 位 0x00结果为0x00模 256 之后 校验通过 ✅五、S19 与 Hex 对比S19S-RecordHexIntel HEX起始符S:地址位数由类型决定S116位, S224位, S332位固定 16 位 扩展地址类型 04扩展地址换类型S1→S2→S3类型04声明高位校验和0xFF - 累加值0x100 - 累加值文件头S0 记录可含文件名无专用文件头文件尾S7/S8/S9类型01两者基本等价可以互相转换。六、总结Hex 文件的核心就是一套带地址 带校验的十六进制数据流。每一行由冒号开头数据长度、地址、类型、数据和校验和五个字段组成扩展线性地址记录类型04解决了 16 位地址不够用的问题。无论是 S19 还是 Hex本质上都是同一件事用文本格式告诉编程器把这个数据烧到那个地址。搞懂了一种另一种就是换个皮。后续我会继续更新 UDS 刷写流程的实际代码实现包含 Python / C# 版本的 Hex 解析器。欢迎关注一起学习交流。参考链接单片机烧录用的hex文件文件格式解析转载深入理解工具链-Hex文件详解