Запись шестнадцатеричных данных в файл
Я пытаюсь записать шестнадцатеричные данные, взятые из файла ascii, во вновь созданный двоичный файл
Пример файла ascii:
98 af b7 93 bb 03 bf 8e ae 16 bf 2e 52 43 8b df
4f 4e 5a e4 26 3f ca f7 b1 ab 93 4f 20 bf 0a bf
82 2c dd c5 38 70 17 a0 00 fd 3b fe 3d 53 fc 3b
28 c1 ff 9e a9 28 29 c1 94 d4 54 d4 d4 ff 7b 40
мой код
hexList = []
with open('hexFile.txt', 'r') as hexData:
line=hexData.readline()
while line != '':
line = line.rstrip()
lineHex = line.split(' ')
for i in lineHex:
hexList.append(int(i, 16))
line = hexData.readline()
with open('test', 'wb') as f:
for i in hexList:
f.write(hex(i))
Мысль hexList
содержит уже шестнадцатеричные преобразованные данные, а f.write(hex(i))
должна записывать эти шестнадцатеричные данные в файл, но python записывает ее в режиме ascii
окончательный вывод: 0x9f0x2c0x380x590xcd0x110x7c0x590xc90x30xea0x37
, что неверно!
где проблема?
Ответы
Ответ 1
Используйте binascii.unhexlify
:
>>> import binascii
>>> binascii.unhexlify('9f')
'\x9f'
>>> hex(int('9f', 16))
'0x9f'
import binascii
with open('hexFile.txt') as f, open('test', 'wb') as fout:
for line in f:
fout.write(
binascii.unhexlify(''.join(line.split()))
)
Ответ 2
заменить:
f.write(hex(i))
С
f.write(chr(i)) # python 2
Или
f.write(bytes((i,))) # python 3
Объяснение
Заметим:
>>> hex(65)
'0x41'
65
должен перевести в один байт, но hex
возвращает четыре символа. write
отправит все четыре символа в файл.
В отличие от python2:
>>> chr(65)
'A'
Это делает то, что вы хотите: chr
преобразует число 65
в однобайтную строку символов, которая является тем, что принадлежит двоичному файлу.
В python3, chr(i)
заменяется на bytes((i,))
.