Python 将二进制文件转为数组

前由

调试外设驱动时,某些外设需要固件而厂商给出的固件是二进制 BIN 文件。对于这些二进制 BIN 文件,一般以文件的形式存放于flash分区,使用的时候通过文件操作读取。上面的方法优点和缺点并存:优点是可以存储稍微大一点的文件;缺点是文件操作麻烦且可能会因为文件系统不稳定导致文件丢失。如果固件 BIN 比较小的话,除开以上存文件系统的方法,另外一种方式即是将 BIN 文件导出为数组,存放在代码中。以下即是使用 Python 来将一个BIN文件转换为数组的代码,转换后可以使用Linux的命令 hex2dump 来验证(注意大小端)。

代码
#!/bin/python
import os
import sys

list_data = []

def read_data_from_binary_file(filename, list_data):
    f = open(filename, 'rb')
    f.seek(0, 0)
    while True:
        t_byte = f.read(1)
        if len(t_byte) == 0:
            break
        else:
            list_data.append("0x%.2X" % ord(t_byte))

def write_data_to_text_file(filename, list_data,data_num_per_line):
    data_num_per_line_int = int(data_num_per_line)
    f_output = open(filename, 'w+')
    f_output.write('const unsigned char test_img[] = \n')
    f_output.write('{\n    ')
    if ((data_num_per_line_int <= 0) or data_num_per_line_int > len(list_data)):
        data_num_per_line_int = 16
        print('data_num_per_line out of range,use default value\n')
    for i in range(0,len(list_data)):
        if ( (i != 0) and(i % data_num_per_line_int == 0)):
            f_output.write('\n    ')
            f_output.write(list_data[i]+', ')
        elif (i + 1) == len(list_data):
            f_output.write(list_data[i])
        else:
            f_output.write(list_data[i]+', ')
    f_output.write('\n};')
    f_output.close()

def main():
    input_f = input("Please input source bin file_name:")
    output_f = input("Please input dest C file name:")
    data_num_per_line = input("Please input a num whitch indicates how many data for one line:")
    read_data_from_binary_file(input_f, list_data)
    write_data_to_text_file(output_f, list_data,data_num_per_line )

if __name__ == "__main__":
    sys.exit(main())

本部分代码参考、转抄自 用Python将二进制文件转化为数组并以文件形式存储 ,在此基础上,修改了部分内容,以便适配 python-3 的编译。使用时,需要输入以下三个参数:源文件名、生成文件名以及16进制数组每一行有多少个数据。

后记

转自: 用Python将二进制文件转化为数组并以文件形式存储

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值