将hex文件转换为bin文件

时间:2013-11-22 20:34:48

标签: python

我是一名新手程序员,也是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()

3 个答案:

答案 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)