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!
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.
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
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.
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]
fonctionne en Python 3.3 (donc "hex_codec" au lieu de "hex").
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'
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.)
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
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'