hex文件格式总结

  • 什么是hex文件?

  • 文件格式

  • 指令类型(Record type)

  • 校验和

    • :04 02B0 00 92020008 AE

    • :04 0000 05 08000135 B9

    • :00 0000 01 FF

  • hex转bin文件

什么是hex文件?

hex是用于文件格式是intel规定的标准,总体来说,hex是文本文件,经常在微控制器的固件开发中看到hex的身影,例如基于STM32F103硬件,使用MDK开发的话,该软件就可以生成hex文件;如下图所示;

这是一个简单的STM32标准外设库工程,代码里什么都没做,具体如下;

#include "stm32f10x.h"
#include <stdio.h>/*** @brief  Main program.* @param  None* @retval None*/
int main(void)
{/* Add your application code here*//* Infinite loop */while (1){}
}

最终,我们打开生成的hex文件,可以看到,这的确是一个文本文件,所以,直接将hex文件烧入MCUFlash还是不行的,除非烧录软件可以把hex文件转成bin文件,然后再进行烧录;

:020000040800F2
:10000000000400204901000899010008950100083A
:10001000970100089101000881020008000000001B
:100020000000000000000000000000009D0100082A
:1000300093010008000000009B010008290200084D
:100040006301000863010008630100086301000800
:1000500063010008630100086301000863010008F0
:1000600063010008630100086301000863010008E0
:1000700063010008630100086301000863010008D0
:10008000630100086301000863010008000000002C
:1000900000000000000000000000000063010008F4
:1000A00063010008630100086301000863010008A0
:1000B0006301000863010008630100086301000890
:1000C0006301000863010008630100086301000880
:1000D0006301000863010008630100086301000870
:1000E0006301000863010008630100086301000860
:1000F0006301000863010008000000000000000028
:100100000000000000000000630100086301000817
:10011000630100086301000863010008630100082F
:10012000630100086301000863010008630100081F
:1001300063010008DFF80CD000F018F80048004711
:10014000A102000800040020064880470648004736
:10015000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE777
:10016000FEE7FEE72D02000835010008064C074DAA
:1001700006E0E06840F0010394E807009847103477
:10018000AC42F6D3FFF7DAFFA4020008B40200087D
:10019000FEE77047FEE7FEE77047704770470000D4
:1001A0000CB500211F4801910091026842F4803291
:1001B00002604FF4A063026802F400320092019AD8
:1001C000521C0192009A12B9019A9A42F3D1026824
:1001D000920324D50121009141684160416841604A
:1001E00041684160416821F47C114160416841F4FB
:1001F00098114160016841F08071016001688901D6
:10020000FCD5416821F003014160416841F00201E1
:1002100041604168C1F381010229FAD10CBD00910E
:100220000CBD00000010024070470000104810B5DF
:10023000016841F00101016041680E4A11404160CE
:1002400001680D4A11400160016821F480210160BC
:10025000416821F4FE0141604FF41F0181600021DB
:10026000C162FFF79DFF05494FF00060086010BDB7
:10027000001002400000FFF8FFFFF6FE08ED00E06E
:10028000FEE702E008C8121F08C1002AFAD1704731
:100290007047002001E001C1121F002AFBD1704706
:1002A000FEE70000B4020008000000200004000087
:0402B00092020008AE
:0400000508000135B9
:00000001FF

文件格式

通过上面的文件,我们不难发现,hex文件每行都由:作为起始码,这是显而易见的,而后面这些乱七八糟的数据又代表什么呢?先看下面这张图;

hexformat

这个和一般的通讯协议类似,一帧数据往往包括起始码,数据长度,数据类型,数据,校验码等等,所以hex文件也不例外,这里它包含几个特点,下面参考了wiki;

  • 起始码:每行数据作为一帧,并由:作为起始码;

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

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

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

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

  • 校验码:(两个十六进制数字),可以用来验证记录没有错误的计算值;

指令类型(Record type)

Record type的值一般是00~05,这表示了,当前这行hex格式的数据,所代表的含义:

Hex code Record type Description Example
00 数据 包含数据和该数据的16位起始地址。字节计数指定记录中的数据字节数。右侧显示的示例为0B (十一)个数据字节(61, 64, 64, 72, 65, 73, 73, 20, 67, 61, 70)位于以地址开头的连续地址 0010。 :0B0010006164647265737320676170A7
01 文件结束 每个文件在文件的最后一行必须恰好发生一次。数据字段为空(因此字节数为00),并且地址字段通常为 0000。 :00000001FF
02 扩展段地址 数据字段包含一个16位的段基址(因此字节数始终为02)与80x86实模式寻址兼容。地址字段(通常为0000)被忽略。最近的段地址02记录乘以16,然后加到每个后续数据记录地址,以形成数据的物理起始地址。这允许寻址多达1 MB的地址空间。 :020000021200EA
03 起始段地址 对于80x86处理器,请指定CS:IP寄存器的初始内容(即起始执行地址)。地址字段是0000,字节数始终为04,前两个数据字节是CS值,后两个是IP值。 :0400000300003800C1
04 扩展线性地址 允许32位寻址(最大4GiB)。记录的地址字段将被忽略(通常是0000),其字节数始终为02。两个数据字节(大字节序)为所有后续类型指定32位绝对地址的高16位00记录; 这些高位地址位适用于下一个04记录。类型的绝对地址00 通过组合最近的高16位地址位形成记录 04 用低16位的地址记录 00记录。如果是类型00 记录之前没有任何类型 04 记录,然后其高16位地址位默认为0000。 :02000004FFFFFC
05 起始线性地址 地址字段是 0000(未使用),字节数始终为04。四个数据字节代表一个32位地址值(big-endian)。对于80386和更高版本的CPU,此地址将加载到EIP寄存器中。 :0400000508000135B9

校验和

最后一个字节表示除了起始码之后,其余字节的校验和,其计算方式,下面简单介绍一下,这里为更加直观 对之前的hex做了一些简单处理,便于后面分析:

:02 0000 04 0800 F2
:10 0000 00 00040020490100089901000895010008 3A
:10 0010 00 97010008910100088102000800000000 1B
:10 0020 00 0000000000000000000000009D010008 2A
:10 0030 00 93010008000000009B01000829020008 4D
:10 0040 00 63010008630100086301000863010008 00
:10 0050 00 63010008630100086301000863010008 F0
:10 0060 00 63010008630100086301000863010008 E0
:10 0070 00 63010008630100086301000863010008 D0
:10 0080 00 63010008630100086301000800000000 2C
:10 0090 00 00000000000000000000000063010008 F4
:10 00A0 00 63010008630100086301000863010008 A0
:10 00B0 00 63010008630100086301000863010008 90
:10 00C0 00 63010008630100086301000863010008 80
:10 00D0 00 63010008630100086301000863010008 70
:10 00E0 00 63010008630100086301000863010008 60
:10 00F0 00 63010008630100080000000000000000 28
:10 0100 00 00000000000000006301000863010008 17
:10 0110 00 63010008630100086301000863010008 2F
:10 0120 00 63010008630100086301000863010008 1F
:10 0130 00 63010008DFF80CD000F018F800480047 11
:10 0140 00 A1020008000400200648804706480047 36
:10 0150 00 FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7 77
:10 0160 00 FEE7FEE72D02000835010008064C074D AA
:10 0170 00 06E0E06840F0010394E8070098471034 77
:10 0180 00 AC42F6D3FFF7DAFFA4020008B4020008 7D
:10 0190 00 FEE77047FEE7FEE77047704770470000 D4
:10 01A0 00 0CB500211F4801910091026842F48032 91
:10 01B0 00 02604FF4A063026802F400320092019A D8
:10 01C0 00 521C0192009A12B9019A9A42F3D10268 24
:10 01D0 00 920324D5012100914168416041684160 4A
:10 01E0 00 41684160416821F47C114160416841F4 FB
:10 01F0 00 98114160016841F08071016001688901 D6
:10 0200 00 FCD5416821F003014160416841F00201 E1
:10 0210 00 41604168C1F381010229FAD10CBD0091 0E
:10 0220 00 0CBD00000010024070470000104810B5 DF
:10 0230 00 016841F00101016041680E4A11404160 CE
:10 0240 00 01680D4A11400160016821F480210160 BC
:10 0250 00 416821F4FE0141604FF41F0181600021 DB
:10 0260 00 C162FFF79DFF05494FF00060086010BD B7
:10 0270 00 001002400000FFF8FFFFF6FE08ED00E0 6E
:10 0280 00 FEE702E008C8121F08C1002AFAD17047 31
:10 0290 00 7047002001E001C1121F002AFBD17047 06
:10 02A0 00 FEE70000B40200080000002000040000 87
:04 02B0 00 92020008 AE
:04 0000 05 08000135 B9
:00 0000 01 FF

这里取最后三条指令,做一下检查;

:04 02B0 00 92020008 AE
:04 0000 05 08000135 B9
:00 0000 01 FF

:04 02B0 00 92020008 AE

0x04 + 0x02 + 0xB0 + 0x92 + 0x02 + 0x08 = 0x152 ~0x52 + 1 = 0xAE

~按位取反

:04 0000 05 08000135 B9

0x04 + 0x05 + 0x80 + 0x01 + 0x35 = 0X47 ~0x47 + 1 = 0XB9

~按位取反

:00 0000 01 FF

~0x01 + 1 = 0xFF

~按位取反

hex转bin文件

资深调包侠找到一个可以使用的包;

pip install intelhex
Per example, converting content of foo.hex to foo.bin addresses from 0 to FF:$ python hex2bin.py -r 0000:00FF foo.hex
Or (equivalent):$ python hex2bin.py -r 0000: -s 256 foo.hex

坐电梯到GitHub

https://github.com/python-intelhex/intelhex

长按下图二维码关注,独自前进,走得快;结伴而行,走得远;在这里除了肝出来的文章,还有一步一个脚印学习的点点滴滴;

基础知识 | hex文件格式详解相关推荐

  1. 计算机在线问,计算机基础知识在线测试问题详解

    计算机基础知识在线测试问题详解 (75页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实用文档题目1of100以下不属于计算机外部设备 ...

  2. 安卓基础知识-layout布局详解。

    安卓基础知识 1. 目录结构: src存放java源代码. gen存放系统自动生成的配置文件 res存放应用用到的所有资源文件,如图片,布局等等 drawable存放不同分辨率的图片 layout存放 ...

  3. Linux基础知识之systemd详解

    0x00 Systemd 简述 1.Linux 启动流程 2.主角登场 0x01 Systemd Unit 1.配置文件 2.启动流程 3.进程树(Process tree) 4.运行级别 0x02 ...

  4. Linux操作系统基础知识命令参数详解

    Linux操作系统 RAID分组 RAID JBOD RAID JBOD的意思是Just a Bunch Of Disks,是将多块硬盘串联起来组成一个大的存储设备,从某种意义上说这种类型不被算作RA ...

  5. Linux基础知识之挂载详解(mount,umount及开机自动挂载)

    挂载概念简述: 根文件系统之外的其他文件要想能够被访问,都必须通过"关联"至根文件系统上的某个目录来实现,此关联操作即为"挂载",此目录即为"挂载点& ...

  6. [转载]Linux基础知识之挂载详解(mount,umount及开机自动挂载)

    挂载概念简述: 根文件系统之外的其他文件要想能够被访问,都必须通过"关联"至根文件系统上的某个目录来实现,此关联操作即为"挂载",此目录即为"挂载点& ...

  7. OpenStack基础知识-virtualenv工具详解

    1.virtualenv介绍 virtualenv通过创建一个单独的虚拟化python运行环境,将我们所需的依赖安装进去,不同项目之间相互不干扰,从而解决不同的项目之间依赖不同,造成的冲突问题 2.安 ...

  8. 大数据学习,基础知识、发展趋势详解

    1.何为大数据? 大数据(big data),IT行业术语,是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量. ...

  9. 软件开发的基础知识—软件版本号详解

    经常被不同的软件版本搞得一头雾水,alpha.beta.demo.professional.enterprise等等,这些版本信息到底都有哪些实际上的含义呢? ·测试版与演示版 α(alpha)版 此 ...

最新文章

  1. 牛客小白月赛25 补题+题解[A-J]
  2. python爬虫获取的网页数据为什么要加[0-[Python爬虫] 等待网页加载后再获取内容...
  3. Seetaface 向树莓派 移植
  4. vue-video-player集成videojs-contrib-hls实现.m3u8文件播放
  5. 面试题:实现call、apply、bind
  6. jQueryEasyUi验证
  7. fscanf简单使用
  8. 回溯法解整数的划分问题(C语言)
  9. Memcached----2-3
  10. 字符串hash(一)
  11. Java 高效编程之 Builder 模式
  12. Replica set 的选举策略之一 (转)
  13. sqlite数据库读写在linux下的权限问题
  14. 使用js获取ajax对象,JS获取dom 对象 ajax操作 读写cookie函数
  15. 每日一记:windows 2008 r2安装单实例oracle 11.2.0.1.0 - 64bit监听和EM服务异常处理
  16. 类似QQ表情的控件 EmotionContainer(原创)
  17. JAVA管理信息系统答辩ppt,个人信息管理系统答辩ppt
  18. macbook 终端命令怎么使用_mac怎么打开终端?mac打开命令提示符的方法
  19. 五年了,我在 CSDN 的两个一百万。
  20. Trained Ternary Quantization

热门文章

  1. 循环结构的数据流分析方法
  2. 【JAVA8】Set排序四种写法-倒序
  3. 常见大数据学习网站总结(不定期更新)
  4. cmd - 切换目录命令cd失效(切换目录失效)
  5. 在 github 建立blg
  6. 光伏产业红与黑 需求寒冬背后暗藏分布式春天
  7. JAVA String时间转化为数据库Date类型
  8. c语言free函数的作用,c语言中free函数的理解
  9. hihoCoder挑战赛16 王胖浩与三角形
  10. 图片头顶距离顶部百分比怎么修改_ps如何修改图片文字 ps怎么修改文字