我是一名新手程序员,也是Python新手。我不得不使用旧版本2.5.2,用于我在工作中分配的项目。我有下面显示的代码,它采用十六进制输入文件并提取部分hex文件并将其写入输出文件。问题是现在它应该被转换为二进制文件。我一直在寻找几种不同的方法来做到这一点,并没有发现任何有效的方法。我想尽可能地使用我的代码,以免我不得不进行重写和调试。作为一个初学者,这是一个很大的问题,但也许没有办法解决这个问题?我希望我可以简单地把我完成的hex文件转换成bin文件。考虑到我现有的代码,这似乎并不是很合适,但它也证明难以实现我在“将hex文件更改为bin文件”下应用我发现的searchnig。希望我忽略了一些微不足道的事情。任何想法或建议将不胜感激。谢谢。
import sys, os
m = open('myfile','w')
fileName = sys.argv[1]
inFile = open(fileName,'r')
objFile = inFile.readlines()
end = len(objFile)
filter_01 = 0
filter_02 = 0
filter_key = 0
ran = []
for idx, line in enumerate(objFile):
if line[:7] == '/origin':
filter_01 = idx + 1
if line[:8] == '03 00 01':
filter_02 = idx
if filter_01 == filter_02:
filter_key = filter_01 + 1
ran = range(filter_key, end)
m.write(objFile[filter_key -1][0:47])
m.write("\n")
m.write(objFile[filter_key -1][:47])
m.write("\n")
for idx in ran:
m.write(objFile[idx]),
m.close()
答案 0 :(得分:2)
通过查看代码,您的hex文件看起来像是由空格分隔的两个十六进制数字的组,因此这里的第一步是弄清楚如何将像'1d e3'
这样的十六进制字符串转换为二进制。由于我们将此文件写入文件,因此我将展示如何将其转换为Python字符串,其中每个字符代表一个字节(我还将显示Python 3.x,其中有一个单独的字节类型):
Python 2.x:
>>> ''.join(x.decode('hex') for x in '1d e3'.split())
'\x1d\xe3'
Python 3.x:
>>> bytes(int(x, 16) for x in '1d e3'.split())
b'\x1d\xe3'
一旦有了这样的二进制字符串,就可以将其写入文件,只需确保使用二进制模式,例如:
m = open('myfile', 'wb')
答案 1 :(得分:1)
第二行 - 将“b”添加到打开模式,如下所示:
... = open(<path>, "wb")
“b”表示“二元”。
另外,使用“with”(我不记得是否在2.5.2中,但如果没有,请从 future 导入)。它更安全,无论如何,您都可以确保文件正确打开和关闭。
答案 2 :(得分:0)
我更干净地改写了这个;根据hex文件的确切格式,您可能需要对其进行一些修改,但它应该是一个很好的起点。
import os
import sys
import optparse
VERBOSE = False
def read_hexfile(fname):
if VERBOSE: print('Reading from {0}'.format(fname))
data = False
res = []
with open(fname, 'r') as inf:
for line in inf:
if data:
if line[:8] == '03 00 01':
data = False
else:
res.extend(int(hex, 16) for hex in line.split())
else:
if line[:7] == '/origin':
data = True
else:
# skip non-data
pass
if VERBOSE: print(' {0} bytes read'.format(len(res)))
return res
def write_binfile(fname, data):
if VERBOSE: print('Writing to {0}'.format(fname))
with open(fname, 'wb') as outf:
outf.write(''.join(chr(i) for i in data))
if VERBOSE: print(' {0} bytes written'.format(len(data)))
def main(input, output):
data = read_hexfile(input)
write_binfile(output, data)
if __name__=="__main__":
parser = optparse.OptionParser()
parser.add_option('-i', '--input', dest='input', help='name of HEX input file')
parser.add_option('-o', '--output', dest='output', help='name of BIN output file')
parser.add_option('-v', '--verbose', dest='verbose', help='output extra status information', action='store_true', default=False)
(options, args) = parser.parse_args()
VERBOSE = options.verbose
main(options.input, options.output)