Quelle est la bonne façon de convertir les octets en chaîne hexadécimale en Python 3?

Quelle est la bonne façon de convertir les octets en chaîne hexadécimale en Python 3?

je vois des revendications d'une bytes.hex méthode, bytes.decode codecs, et ont essayé autres fonctions possibles de moindre étonnement sans succès. Je veux juste mes octets comme hexagone!

121
demandé sur agf 2011-07-08 16:31:54

8 réponses

depuis Python 3.5 ce n'est finalement plus gênant:

>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'

et à l'inverse:

>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'

fonctionne également avec le mutable bytearray type.

190
répondu Felix Weis 2016-03-22 08:07:50

utiliser le binascii module:

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

voir cette réponse: Python 3.1.1 chaîne hex

88
répondu Mu Mind 2017-05-23 11:47:32

Python a des octets-à-octets codecs standard qui effectuent des transformations commodes comme la compression quoted-printable (s'adapte en 7bits ascii), base64 (s'adapte en alphanumériques), HEX escaping, gzip et bz2. En Python 2, vous pourriez faire:

b'foo'.encode('hex')

En Python 3, str.encode / bytes.decode sont strictement pour les octets<->str conversions. À la place, vous pouvez faire ceci, qui fonctionne à travers Python 2 et Python 3 ( s/encode / decode / g pour l'inverse):

import codecs
codecs.getencoder('hex')(b'foo')[0]

à partir de Python 3.4, il y a une option moins embarrassante:

codecs.encode(b'foo', 'hex')

ces codecs misc sont également accessibles à l'intérieur de leurs propres modules (base64, zlib, bz2, uu, quopri, binascii); L'API est moins cohérente, mais pour les codecs de compression elle offre plus de contrôle.

32
répondu Gabriel 2013-12-19 21:53:01
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]

fonctionne en Python 3.3 (donc "hex_codec" au lieu de "hex").

7
répondu Richard Kiss 2015-03-27 12:19:06

la méthode binascii.hexlify() convertit bytes en bytes représentant la chaîne ascii hex. Cela signifie que chaque octet de l'entrée sera converti en deux caractères ascii. Si vous voulez un vrai str , alors vous pouvez .decode("ascii") le résultat.

j'ai inclus un extrait qui l'illustre.

import binascii

with open("addressbook.bin", "rb") as f: # or any binary file like '/bin/ls'
    in_bytes = f.read()
    print(in_bytes) # b'\n\x16\n\x04'
    hex_bytes = binascii.hexlify(in_bytes) 
    print(hex_bytes) # b'0a160a04' which is twice as long as in_bytes
    hex_str = hex_bytes.decode("ascii")
    print(hex_str) # 0a160a04

de la chaîne hexadécimale "0a160a04" peuvent revenir à la bytes avec binascii.unhexlify("0a160a04") qui gives back b'\n\x16\n\x04'

5
répondu ecerulm 2015-06-09 09:28:38

OK, la réponse suivante est légèrement au-delà de la portée si vous ne vous souciez que de Python 3, mais cette question Est le premier hit Google même si vous ne spécifiez pas la version de Python, alors voici une façon qui fonctionne à la fois sur Python 2 et Python 3.

j'interprète aussi la question à propos de la conversion d'octets en str type: c'est-à-dire, bytes-y sur Python 2, et Unicode-y sur Python 3.

étant Donné que, le meilleur l'approche que je connais est:

import six

bytes_to_hex_str = lambda b: ' '.join('%02x' % i for i in six.iterbytes(b))

l'assertion suivante sera vraie pour Python 2 ou Python 3, en supposant que vous n'avez pas activé le unicode_literals futur en Python 2:

assert bytes_to_hex_str(b'jkl') == '6a 6b 6c'

(Ou vous pouvez utiliser ''.join() d'omettre l'espace entre les octets, etc.)

1
répondu Peter 2018-06-16 17:57:56

il peut être utilisé le spécificateur de format %x02 qui formate et produit une valeur hexadécimale. Par exemple:

>>> foo = b"tC\xfc}\x05i\x8d\x86\x05\xa5\xb4\xd3]Vd\x9cZ\x92~'6"
>>> res = ""
>>> for b in foo:
...     res += "%02x" % b
... 
>>> print(res)
7443fc7d05698d8605a5b4d35d56649c5a927e2736
0
répondu Arg0s 2018-07-10 16:03:21

Si vous voulez convertir b'\x61' 97 ou "0x61', vous pouvez essayer ceci:

[python3.5]
>>>from struct import *
>>>temp=unpack('B',b'\x61')[0] ## convert bytes to unsigned int
97
>>>hex(temp) ##convert int to string which is hexadecimal expression
'0x61'

référence: https://docs.python.org/3.5/library/struct.html

-1
répondu hao li 2017-05-08 14:59:12