Quelle est la bonne façon de convertir des octets en une chaîne hexadécimale en Python 3?
Je vois des revendications d'une bytes.hex
méthode, des bytes.decode
codecs, et j'ai essayé d' autres fonctions possibles du moindre étonnement en vain. Je veux juste mes octets en hexadécimal!
python
python-3.x
hex
Matt Joiner
la source
la source
Réponses:
Depuis Python 3.5, ce n'est finalement plus gênant:
et inverser:
fonctionne également avec le
bytearray
type mutable .Référence: https://docs.python.org/3/library/stdtypes.html#bytes.hex
la source
bytes.fromhex()
est également disponible sur Python 3.0+ (et pas seulement 3.5+).bytes.hex()
est uniquement sur Python 3.5+.Utilisez le
binascii
module:Voir cette réponse: chaîne Python 3.1.1 en hexadécimal
la source
str
mais unbytes
. Je sais que l'OP semble satisfait de la réponse mais ne sera pas mieux d'étendre cette réponse pour l'inclure.decode("ascii")
également pour la convertir en "chaîne"bytes
. Si vousprint(b'666f6f')
obtenez leb
dans l'impression. Si vous.decode("ascii")
ne le faites pas. Je pensais juste à la façon dont ceux qui avaient réellement unbytes
(vrai binaire avec des éléments> 128, pas une chaîne ascii) voulaient l'imprimer..hex()
méthode en Python 3.5+Python a des codecs standard octets à octets qui effectuent des transformations pratiques comme les citations imprimables (s'adapte en 7 bits ascii), base64 (s'adapte en alphanumériques), l'échappement hexadécimal, la compression gzip et bz2. En Python 2, vous pourriez faire:
En Python 3,
str.encode
/bytes.decode
sont strictement réservés aux conversions d'octets <-> str. Au lieu de cela, vous pouvez le faire, ce qui fonctionne sur Python 2 et Python 3 ( s / encode / decode / g pour l'inverse):À partir de Python 3.4, il existe une option moins gênante:
Ces codecs divers 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.
la source
LookupError: unknown encoding: hex
binascii.hexlify(b'foo')
directementfonctionne en Python 3.3 (donc "hex_codec" au lieu de "hex").
la source
La méthode
binascii.hexlify()
sera convertiebytes
en unbytes
représentant la chaîne hexadécimale ascii. Cela signifie que chaque octet dans l'entrée sera converti en deux caractères ascii. Si vous voulez une vraiestr
sortie, vous pouvez.decode("ascii")
le résultat.J'ai inclus un extrait qui l'illustre.
de la chaîne hexagonale
"0a160a04"
à peut revenir à labytes
avec cebinascii.unhexlify("0a160a04")
qui donne de retourb'\n\x16\n\x04'
la source
OK, la réponse suivante est légèrement hors de portée si vous ne vous souciez que de Python 3, mais cette question est le premier hit de Google même si vous ne spécifiez pas la version Python, alors voici une méthode qui fonctionne à la fois sur Python 2 et Python 3 .
J'interprète également la question de la conversion d'octets en
str
type: autrement dit, octets-y sur Python 2 et Unicode-y sur Python 3.Compte tenu de cela, la meilleure approche que je connaisse est:
L'affirmation suivante sera vraie pour Python 2 ou Python 3, en supposant que vous n'avez pas activé l'
unicode_literals
avenir dans Python 2:(Ou vous pouvez utiliser
''.join()
pour omettre l'espace entre les octets, etc.)la source
il peut être utilisé le spécificateur de
%x02
format qui formate et génère une valeur hexadécimale. Par exemple:la source
res.upper()
Nouveau dans python 3.8, vous pouvez passer un argument délimiteur à la
hex
fonction, comme dans cet exemplehttps://docs.python.org/3/library/stdtypes.html#bytes.hex
la source
Si vous voulez convertir b '\ x61' en 97 ou '0x61', vous pouvez essayer ceci:
Référence: https://docs.python.org/3.5/library/struct.html
la source