概述
Python转换Hex文件到C语言数组
需求背景
MiniFly飞行器的遥控器带有IAP功能,APP代码必须偏移9K字节的位置下载,所以下载APP代码之前要先下载BootLoader代码到起始位置0x08000000,然后再偏移9k字节的位置,下载APP代码,我想通过把BootLoader的bin文件直接在APP中写入到Flash的指定位置,所以就需要查看BootLoader代码生成的bin文件的具体内容,然后通过
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为模进行以下补足.
代码实现
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语言数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复