admin管理员组

文章数量:1025347

hex文件格式解析,hex转bin(C语言)

前言

hex转bin文件网上有很多现成的工具,但还是想了解下其中的数据结构跟原理

区别

hex跟bin都是程序烧写的文件,那他们有什么不同呢?

首先看大小,hex文件都会大于bin文件,hex文件打开可以看到一堆数字,而bin文件只会得到一堆乱码。

其实bin文件就是你程序执行文件的二进制文件,里面可以看做都是机械码,芯片可以直接运行的

hex文件不但包含bin文件的内容(需要自己转),还有具体内容存放地址,程序运行开始位置等。所以我们用烧录器烧程序都需要用hex而不是bin,因为bin没有程序具体烧录地址的位置。

分析

首先我们随便用记事本打开一个hex文件,可以看到

其格式表示为:

起始本行数据长度偏移量数据类型数据校验码
:(冒号)lenload offsettypedatachecksum
  • 以行为单位,每行以冒号开头,内容全部为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文件,可以看到

其格式表示为:

起始本行数据长度偏移量数据类型数据校验码
:(冒号)lenload offsettypedatachecksum
  • 以行为单位,每行以冒号开头,内容全部为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语言)