2013-11-22 147 views
2

我是一位初级程序员,也是Python的新手。我不得不使用旧版2.5.2作为我在工作中分配的项目。我已经得到如下所示的代码,它接受一个十六进制输入文件并提取部分十六进制文件并将其写入输出文件。问题是现在它应该被转换成二进制文件。我一直在寻找几种不同的方式来做到这一点,并没有发现任何可行的方法。我想尽可能地使用我的代码,以免我必须重写和调试。作为一个初学者,这是一个很大的担忧,但也许没有办法解决这个问题?我希望我可以简单地把我的完成的十六进制文件,并将其转换为一个bin文件。鉴于我现有的代码,这看起来不是非常合适,但它也证明难以实现我在“将hex文件更改为bin文件”下找到的searchnig。希望我可以忽略一些微不足道的东西。任何想法或建议,将不胜感激。谢谢。将十六进制文件转换为bin文件

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() 

回答

1

次行 - 添加 “B”,以开放模式,所以它看起来像:

... = open(<path>, "wb") 

“B” 是指 “二进制”。另外,使用“with”(我不记得是否在2.5.2中,但如果没有,从未来导入它)。这是更安全的,你会确信无论如何,文件将被正确打开和关闭。

2

从看你的代码,它看起来像你的十六进制文件有两个由空格分隔的十六进制数字组,所以第一步是找出如何将十六进制字符串如'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' 
    

一旦你有一个二进制串升IKE在此,你可以把它写入一个文件,只要确保你使用二进制模式,例如:

m = open('myfile', 'wb') 
0

我已经重写这个有点更干净;取决于十六进制文件的确切格式,您可能需要对其进行一些修改,但这应该是一个很好的起点。

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) 
相关问题