2013-11-22 2 views
2

Я новичок программист, а также новичок в Python. Мне нужно использовать старую версию 2.5.2 для проекта, который был назначен на работе. У меня есть этот код, показанный ниже, который принимает шестнадцатеричный входной файл и извлекает часть шестнадцатеричного файла и записывает его в выходной файл. Проблема в том, что теперь он должен быть преобразован в двоичный файл. Я рассматривал несколько разных способов сделать это и не нашел ничего, что сработает. Я хотел бы использовать код, который у меня есть, насколько это возможно, чтобы избавить меня от необходимости переписывать и отлаживать. Как новичок, это большая проблема, но, возможно, нет никакого способа обойти это? Я надеялся, что могу просто взять мой законченный шестнадцатеричный файл и преобразовать его в файл bin. Это не кажется очень хорошим, учитывая мой существующий код, но он также оказывается неуловимым, пытаясь применить то, что я нашел, поиск в разделе «изменение шестнадцатеричного файла в файл bin». Надеюсь, я упускаю из виду что-то тривиальное. Любые идеи или предложения будут оценены. Благодарю.Преобразование шестнадцатеричного файла в файл 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

Вторая строка - добавить "Ъ" в режим открытия, так это выглядит:

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

"б" означает "двоичный".

Кроме того, используйте «с» (я не помню, было ли это в 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' 
    

После того как вы двоичную строку л икэ это вы можете записать его в файл, просто убедитесь, что вы используете бинарный режим, например:

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) 
Смежные вопросы