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

概述

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语言数组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部