HEX文件格式详解

27 篇文章 35 订阅
本文详细解析了HEX文件的格式,包括记录类型、数据字节数、起始地址和校验和等,并通过一个实例解释了如何在Notepad++中查看HEX文件。此外,还介绍了如何用C#代码将HEX文件转换为BIN文件。文章特别指出,HEX文件中的开始线性地址记录通常关联于函数入口地址。最后,提供了一个HEX文件记录的实例分析,展示了数据记录的加载偏移、校验和计算以及数据的实际存储位置。
摘要由CSDN通过智能技术生成


用notepad++打开一个hex文件,以下图来解释hex文件格式

在这里插入图片描述********************
在这里插入图片描述如图,其中第一行020000040002f8中,可以看做是0x02 0x00 0x00 0x04 0x00 0x02 0xf8,其前四个字节和最后一个字节有特殊含义。中间为数据

第一个0x02表示该行数据中有两个数据

第二个,第三个0x00 0x00表示本行数据的起始地址位

第四个字节有0x00 0x01 0x02 0x03 0x04 0x05,分别有以下含义

‘00’ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

‘01’ End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾

‘02’ Extended Segment Address Record: 用来标识扩展段地址的记录

‘03’ Start Segment Address Record:开始段地址记录

‘04’ Extended Linear Address Record: 用来标识扩展线性地址的记录

‘05’ Start Linear Address Record:开始线性地址记录

最后一个字节0xf8为校验和。校验和= 0x100 - 累加和。在nodepad++中,如果该校验和不是绿色,则表示该校验和是错的。

注意,0×04标识扩展线性地址的记录,所以如上图中的020000040002f8中,拓展地址是0002。那么第二行数据的起始地址就是0002c000,即0x0002c000开始

补充内容开始:

前面记录的比较简单,但看起来还是不好理解,下面是详细通俗易懂版本的hex文件说明,应该能满足大部分同学的需要。
在这里插入图片描述第一字节表示该行的数据字节数;如第1行只有 0x08 0x00 两个字节的数据,类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800<<16) 后作为基地址。并且表示在下一个04类型行出现之前都要使用该地址.

例如第2行的地址信息是 0x0000,则表示该行数据从0x08000000( (0x0800<<16) | 0x0000 )开始记录。

第3行则从 0x08000010 ( (0x0800<<16) | 0x0010 )开始记录。

另外最后一个字节的校验和 0xBA = 0xff & ( 0x100- (0x10+4(0x00)+0x5F+0x00+…+0x00+0x08) ) = 0xff & (0x100-0x246);*

没错,就是从每行的第一个字节开始计算。

在这里插入图片描述小技巧: 在nodepad++中,如果校验和不是绿色,则表示校验和错误,如上图中的第6行.正确的应该是 BA(绿色)
在这里插入图片描述16行位置只有四个数据,但是 标注类型是 05, 即他是一个 “开始线性地址记录”。
说那么多,什么是开始线性地址记录呢?其实他就是函数入口地址
例如我的 .map 文件中可以看到以下信息

Memory Map of the image

Image Entry point : 0x08020189

__Vectors_End 0x08020188 Data 0 …
__main 0x08020189 Thumb Code 0 entry.o(.ARM.Collect
00000000)
_main_stk 0x08020189 Thumb Code 0 entry2.o(.ARM.Collect
00000001)
_main_scatterload 0x0802018d Thumb Code 0 entry5.o(.ARM.Collect
00000004)

在这里插入图片描述

这一行就是类型是 0x01, 表示文件结束.

补充:

HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为:

内容占用字节数
Record mark ‘:’1 byte
Length1 byte
Load offset2 bytes
Record type1 byte
INFO or DATAn bytes
CHKSUM1 byte

看个例子:
在这里插入图片描述
对上面的HEX文件进行分析:

第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0008,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为==(0x0008 << 16)==。后面的数据记录都以这个地址为基地址。

第2条记录的长度为10(16)LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为0X80000,加上OFFSET,这个记录里的16BYTE的数据的起始地址就是0x80000 + 0x0004 = 0x80004.

第3条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识文件的结尾。

在上面这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0x80004.

Hex文件转bin文件的代码实现【C#】:

https://blog.csdn.net/sinat_40003796/article/details/126248276


参考:
https://blog.csdn.net/weixin_39752827/article/details/81477686/
https://blog.csdn.net/zf_c_cqupt/article/details/52321881

  • 19
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElecNoon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值