前由
调试外设驱动时,某些外设需要固件而厂商给出的固件是二进制 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进制数组每一行有多少个数据。