admin管理员组文章数量:1025347
hex文件格式解析,hex转bin(C语言)
前言
hex转bin文件网上有很多现成的工具,但还是想了解下其中的数据结构跟原理
区别
hex跟bin都是程序烧写的文件,那他们有什么不同呢?
首先看大小,hex文件都会大于bin文件,hex文件打开可以看到一堆数字,而bin文件只会得到一堆乱码。
其实bin文件就是你程序执行文件的二进制文件,里面可以看做都是机械码,芯片可以直接运行的
hex文件不但包含bin文件的内容(需要自己转),还有具体内容存放地址,程序运行开始位置等。所以我们用烧录器烧程序都需要用hex而不是bin,因为bin没有程序具体烧录地址的位置。
分析
首先我们随便用记事本打开一个hex文件,可以看到
其格式表示为:
起始 | 本行数据长度 | 偏移量 | 数据类型 | 数据 | 校验码 |
:(冒号) | len | load offset | type | data | checksum |
- 以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)
其中数据类型有: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: 开始线性地址记录
如上图第一行(所有的数字两个为一个字节,要以16进制的方式去看。但是其存在文本是以ascii去存放的),
:020000040801F1
: 表示这一行的数据起始位
02: 表示这一行的数据有两个字节的长度(其中08为一个,01为一个)
0000 表示偏移值
04 表示数据类型,看上面列出的5种。04--标识扩展线性地址的记录,
官方文档解释为32位扩展线性地址记录用于指定线性基址的位16-31
0801 表示数据内容,这里表示具体的扩展线性地址的值为0x0801
F1 是校验位,运算规则是 0x100 - 前面除冒号所有16进制累加和
这里就为 0x100 - ((0x02+0x00+0x00+0x04+0x08+0x01)&0xff) = 0xf1
综合来看,这一行表示将地址指向0x08010000的地址,后面的所有操作就会根据这个地址来存放数据。注意这里的偏移值0000是无用的,我说的0x08010000是因为高16位为0x0801,而后面数据存放的具体低16位要看那个数据的偏移值。
看原文解释:
分析第二行
:1000000010380120AD010108B5010108B302010853
10 表示数据长度16字节
0000 偏移量
00 表示这是数据记录
10380120AD010108B5010108B3020108 具体的数据(这里的数据都是低位在前高位在后)
53 校验
这一行表示将数据存放在基于0x08010000地址,连续16个。其中0x08010就是上面第一行定义的高16位字节值,0000是这里所代表的偏移值
在文件最后的地方,还会有这么两行数据
:040000050801018964
:00000001FF
同样来分析
第一个,直接看类型为05,表示开始线性地址记录,通俗来说就是你main函数的程序入口,具体为0x08010189。大家可以去翻一下自己程序map文件main的地址跟自己hex对比看看
第二个,直接看类型为01,表示标识HEX文件的结尾,看到这个就可以结束读取hex文件了。后面一般也不会再有内容(有也当看不到)
剩下还有数据类型02 03
02 跟 04是差不多的作用。有一点差别就是02表示16位扩展段地址记录用于指定段基址的位4-19
03跟 05也是差不多。
所有的数据类型具体可以看hex格式详解
根据上面整理的内容做了一份hex转bin的程序(C语言,压缩包包含hex格式详解)
积分支持下载(点我)
百度云分享:
链接:
提取码:a1b2
有疑问可以评论反馈
hex文件格式解析,hex转bin(C语言)
前言
hex转bin文件网上有很多现成的工具,但还是想了解下其中的数据结构跟原理
区别
hex跟bin都是程序烧写的文件,那他们有什么不同呢?
首先看大小,hex文件都会大于bin文件,hex文件打开可以看到一堆数字,而bin文件只会得到一堆乱码。
其实bin文件就是你程序执行文件的二进制文件,里面可以看做都是机械码,芯片可以直接运行的
hex文件不但包含bin文件的内容(需要自己转),还有具体内容存放地址,程序运行开始位置等。所以我们用烧录器烧程序都需要用hex而不是bin,因为bin没有程序具体烧录地址的位置。
分析
首先我们随便用记事本打开一个hex文件,可以看到
其格式表示为:
起始 | 本行数据长度 | 偏移量 | 数据类型 | 数据 | 校验码 |
:(冒号) | len | load offset | type | data | checksum |
- 以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)
其中数据类型有: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: 开始线性地址记录
如上图第一行(所有的数字两个为一个字节,要以16进制的方式去看。但是其存在文本是以ascii去存放的),
:020000040801F1
: 表示这一行的数据起始位
02: 表示这一行的数据有两个字节的长度(其中08为一个,01为一个)
0000 表示偏移值
04 表示数据类型,看上面列出的5种。04--标识扩展线性地址的记录,
官方文档解释为32位扩展线性地址记录用于指定线性基址的位16-31
0801 表示数据内容,这里表示具体的扩展线性地址的值为0x0801
F1 是校验位,运算规则是 0x100 - 前面除冒号所有16进制累加和
这里就为 0x100 - ((0x02+0x00+0x00+0x04+0x08+0x01)&0xff) = 0xf1
综合来看,这一行表示将地址指向0x08010000的地址,后面的所有操作就会根据这个地址来存放数据。注意这里的偏移值0000是无用的,我说的0x08010000是因为高16位为0x0801,而后面数据存放的具体低16位要看那个数据的偏移值。
看原文解释:
分析第二行
:1000000010380120AD010108B5010108B302010853
10 表示数据长度16字节
0000 偏移量
00 表示这是数据记录
10380120AD010108B5010108B3020108 具体的数据(这里的数据都是低位在前高位在后)
53 校验
这一行表示将数据存放在基于0x08010000地址,连续16个。其中0x08010就是上面第一行定义的高16位字节值,0000是这里所代表的偏移值
在文件最后的地方,还会有这么两行数据
:040000050801018964
:00000001FF
同样来分析
第一个,直接看类型为05,表示开始线性地址记录,通俗来说就是你main函数的程序入口,具体为0x08010189。大家可以去翻一下自己程序map文件main的地址跟自己hex对比看看
第二个,直接看类型为01,表示标识HEX文件的结尾,看到这个就可以结束读取hex文件了。后面一般也不会再有内容(有也当看不到)
剩下还有数据类型02 03
02 跟 04是差不多的作用。有一点差别就是02表示16位扩展段地址记录用于指定段基址的位4-19
03跟 05也是差不多。
所有的数据类型具体可以看hex格式详解
根据上面整理的内容做了一份hex转bin的程序(C语言,压缩包包含hex格式详解)
积分支持下载(点我)
百度云分享:
链接:
提取码:a1b2
有疑问可以评论反馈
本文标签: hex文件格式解析,hex转bin(C语言)
版权声明:本文标题:hex文件格式解析,hex转bin(C语言) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/IT/1694635633a254333.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论