2015-09-26 2 views
0

Я хочу выполнить некоторую операцию в двоичном файле, используя скрипт python. У меня есть один двоичный файл. И я хочу добавить к нему двоичные данные.редактирование двоичного файла с использованием сценария python

Пример:
Файл abc.bin доступен.

Команда:

питон file_append.py abc.bin 1234 5678

Я хочу, чтобы добавить "1234" и "5678" в конце двоичного файла abc.bin.

Так я открыл файл в режиме «AB» (добавить + двоичный). Когда я добавляю аргумент командной строки, он добавляет значение ASCII аргумента.

Как я могу добавить шестнадцатеричное значение (здесь 1234 и 5678) в конце файла?

Код:

fo = open(str(sys.argv[1]), 'ab') 
fv = string.atoi(sys.argv[2]) 
ft = string.atoi(sys.argv[3]) 
fo.write(fv) 
+0

так что вы хотите добавить 4 байта с гекса значения 12, 34, 56 и 78? – ewcz

ответ

1

, если вы хотите, чтобы проанализировать аргументы командной строки, разделить их на две цифры, интерпретировать то эти цифры как ASCII коды гекса и добавьте это в конце двоичного файла интерес, то вы могли бы сделать что-то вроде этого

of = open(sys.argv[1], 'ab') 
for arg in sys.argv[2:]: 
    val = int(arg) 
    for b in (val/100, val%100): 
     of.write(chr(int(str(b), base=16))) 

python file_append.py abc.bin 1234 5678 затем производит файлу abc.bin, содержание которых может быть проверено с hexdump -C abc.bin, который показывает

00000000 12 34 56 78          |.4Vx| 
00000004 
+0

Это не справятся с данными, содержащими шестнадцатеричных цифр> 9. –

+0

, что он не будет, я предполагал (возможно, ошибочно), что вход ожидается десятичное целое число ... – ewcz

+0

Справедливо. Но в этом случае ваш код по-прежнему не так, потому что он интерпретирует «1234» как 0x1234 вместо 0x04d2. –

0

Я решил его код ниже.

fo = open(str(sys.argv[1]), 'ab') 
f1 = binascii.a2b_hex(sys.argv[2]) 
fo.write(f1) 
f2 = binascii.a2b_hex(sys.argv[3]) 
fo.write(f2) 
fo.close() 

Благодарим за отзыв.

+0

Вы можете присоединиться строки данных в одну строку & передать это в 'a2b_hex', а не конвертировать и писать отдельно. И тогда ваша программа может справиться с любым количеством строк данных. Например, 'binascii.a2b_hex (''. Join (sys.argv [2:]))' –

Смежные вопросы