web-dev-qa-db-fra.com

Python écrire une chaîne d'octets dans un fichier

Comment puis-je écrire une chaîne d'octets dans un fichier, en mode octet, en utilisant python?

J'ai:

['0x28', '0x0', '0x0', '0x0']

Comment écrire 0x28, 0x0, 0x0, 0x0 dans un fichier? Je ne sais pas comment transformer cette chaîne en un octet valide et l'écrire.

16
user2483347

Mappez vers un objet bytearray() ou bytes(), puis écrivez-le dans le fichier:

with open(outputfilename, 'wb') as output:
    output.write(bytearray(int(i, 16) for i in yoursequence))

Une autre option consiste à utiliser la fonction binascii.unhexlify() pour transformer vos chaînes hexadécimales en valeur bytes:

from binascii import unhexlify

with open(outputfilename, 'wb') as output:
    output.write(unhexlify(''.join(format(i[2:], '>02s') for i in b)))

Ici, nous devons d'abord couper la partie 0x, Puis reformater la valeur pour la remplir de zéros et joindre le tout en une seule chaîne.

18
Martijn Pieters

Dans Python 3.X, bytes() transformera une séquence entière en une séquence d'octets:

>>> bytes([1,65,2,255])
b'\x01A\x02\xff'

Une expression de générateur peut être utilisée pour convertir votre séquence en entiers (notez que int(x,0) convertit une chaîne en un entier selon son préfixe. 0x Sélectionne hex):

>>> list(int(x,0) for x in ['0x28','0x0','0x0','0x0'])
[40, 0, 0, 0]

Les combiner:

>>> bytes(int(x,0) for x in ['0x28','0x0','0x0','0x0'])
b'(\x00\x00\x00'

Et en les écrivant:

>>> L = ['0x28','0x0','0x0','0x0']
>>> with open('out.dat','wb') as f:
...  f.write(bytes(int(x,0) for x in L))
...
4
9
Mark Tolonen