web-dev-qa-db-ja.com

16進データをファイルに書き込む

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_これは間違っています!

問題はどこにありますか?

13
Pythonizer

使用する - 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()))
        )
11
falsetru

交換:

_    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,))に置き換えられます。

4
John1024