我是靠谱客的博主 自觉小蜜蜂,这篇文章主要介绍Python转换hex文件为C语言数组Python转换Hex文件到C语言数组,现在分享给大家,希望可以做个参考。

Python转换Hex文件到C语言数组

需求背景

MiniFly飞行器的遥控器带有IAP功能,APP代码必须偏移9K字节的位置下载,所以下载APP代码之前要先下载BootLoader代码到起始位置0x08000000,然后再偏移9k字节的位置,下载APP代码,我想通过把BootLoader的bin文件直接在APP中写入到Flash的指定位置,所以就需要查看BootLoader代码生成的bin文件的具体内容,然后通过

复制代码
1
2
3
4
5
static const uint8_t bootload_src[]__attribute__((at(0x08000000)))= { //bin文件的具体内容 }

写入Flash的指定位置

然而网上的bin查看器以及可以打开bin的文件打开均是乱码,hex2bin文件转换后的bin文件也是乱码,迫不得已去了解下hex文件和bin文件的关系

hex文件比bin文件多的东西最关键的就是数据写入的位置,所以理论上把hex中的bin文件的数据提取出来就行了

HEX文件格式

一般Hex文件的记录格式如下

:[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和]

  • :(冒号)每个Intel HEX记录都由冒号开头 ;
  • 数据长度域,它代表记录当中数据字节(dd)的数量;
  • 地址域, 它代表记录当中数据的起始地址;
    • 00 – 数据记录(Data Record)
    • 01 – 文件结束记录(End of FileRecord)
    • 02 – 扩展段地址记录(ExtendedSegment Address Record)
    • 03 – 开始段地址记录(Start Segment Address Record)
    • 04 – 扩展线性地址记录(Extended Linear Address Record)
    • 05 – 开始线性地址记录(Extended Segment Address Record)
  • 数据域,它代表一个字节的数据.一 个记录可以有许多数据字节. 记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.
  • 校验和域 ,它表示这个记录的校验和.校验和的计算是通 过将记录当中所有十六进制编码数字对的值相加, 以256为模进行以下补足.

代码实现

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import sys #hex文件格式 #[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和] def GetBin(src_name,dst_file): print("data will be save to :"+dst_file) print("data from :"+src_name) src = open(src_name,'r') #只读方式打开 dst = open(dst_file,"w+") #追加的方式保存 dst.write("static const unsigned int src_bootload[]__attrbute__((at(0x08000000))) = {n") while(True): str_file = src.readline() data_len = (int)(len(str_file)) if not str_file: break #print(str_file[8]) #str_file[8]表示数据的类型 if (int(str_file[8]) != 0): #去除与bin数据无关的数据 continue str_file = str_file[9:(data_len-3)] #将长度、地址、类型和校验和去掉 list_file = list(str_file) #将字符串数据转化成列表,方便插入数据 for i in range(1,((data_len-3)-9)//2+1): #在后插入',' list_file.insert(2*i+(i-1),",") #2*i的i表示前面有几个字节(2:一个字节两个数字),i-1,表示前面有几个逗号 str_file = ''.join(list_file) #将插入数据后的列表再次转换成字符串 list_file = list(str_file) #在插入逗号后再插入0x for i in range(0,((data_len-3)-9)//2): #在前插入'0x' list_file.insert(2*i+2*i,"0x") #第一个i表示前面的字节个数,第二个i表示0x的个数 str_file = ''.join(list_file) #将插入数据后的列表再次转换成字符串 dst.write(' '+str_file) #处理完成一行数据后保存数据并加入回车 dst.write("n") dst.write("}") src.close() dst.close() def main(): src_filename = sys.argv[1] dst_filename = sys.argv[2] GetBin(src_filename,dst_filename) if __name__ == "__main__": if(len(sys.argv) != 3): print("para errorrn") exit() main()

使用方法

  • 首先要有Python的环境

  • 在命令窗口执行以下指令

    python D:DeskTophex2bin.py D:DeskTopBootloader_F103.hex .bin.bin

    • D:DeskTophex2bin.py是指hex2bin.py所在路径
    • D:DeskTopBootloader_F103.hex是指Bootloader_F103.hex要转换的hex文件所在路径
    • .bin.bin是指要生成的文件名以及后缀所在路径
  • 最简单的方法,在命令窗口输入python,然后把hex2bin.py拖进命令窗口,再把要转换的hex文件拖进命令窗口,然后再输入生成的文件名字即可

最后

以上就是自觉小蜜蜂最近收集整理的关于Python转换hex文件为C语言数组Python转换Hex文件到C语言数组的全部内容,更多相关Python转换hex文件为C语言数组Python转换Hex文件到C语言数组内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部