ASCIIファイルから取得した16進データを新しく作成したバイナリファイルに書き込もうとしています
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
はすでに16進数に変換されたデータを保持しているので、f.write(hex(i))
はこれらの16進数データをファイルに書き込むべきですが、python asciiモードで書き込みます
最終出力:_0x9f0x2c0x380x590xcd0x110x7c0x590xc90x30xea0x37
_これは間違っています!
問題はどこにありますか?
使用する - 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()))
)
交換:
_ f.write(hex(i))
_
と:
_ f.write(chr(i)) # python 2
_
または、
_ f.write(bytes((i,))) # python 3
_
観察する:
_>>> hex(65)
'0x41'
_
_65
_は1バイトに変換する必要がありますが、hex
は4文字の文字列を返します。 write
は、4文字すべてをファイルに送信します。
対照的に、python2では:
_>>> chr(65)
'A'
_
これはあなたが望むことをします:chr
は、数値_65
_をバイナリファイルに属する文字のシングルバイト文字列に変換します。
Python3では、chr(i)
はbytes((i,))
に置き換えられます。