web-dev-qa-db-fra.com

Écriture de données hexadécimales dans un fichier

J'essaie d'écrire des données hexadécimales tirées d'un fichier ascii dans un fichier binaire nouvellement créé

exemple de fichier 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

mon code

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))

Pensé que hexList contient des données déjà converties en hexadécimal et f.write(hex(i)) devrait écrire ces données hexadécimales dans un fichier, mais python l'écrit en mode ascii

sortie finale: 0x9f0x2c0x380x590xcd0x110x7c0x590xc90x30xea0x37 qui est faux!

où est le problème?

13
Pythonizer

Utilisation 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

remplacer:

    f.write(hex(i))

Avec:

    f.write(chr(i))  # python 2

Ou,

    f.write(bytes((i,))) # python 3

Explication

Observer:

>>> hex(65)
'0x41'

65 Devrait se traduire en un seul octet mais hex renvoie une chaîne de quatre caractères. write enverra les quatre caractères au fichier.

En revanche, en python2:

>>> chr(65)
'A'

Cela fait ce que vous voulez: chr convertit le nombre 65 En une chaîne de caractères d'un octet qui appartient à un fichier binaire.

En python3, chr(i) est remplacée par bytes((i,)).

4
John1024