J'essaie d'utiliser str.encode()
mais j'obtiens
>>> "hello".encode(hex)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be string, not builtin_function_or_method
J'ai essayé plusieurs variantes et elles semblent toutes fonctionner dans Python 2.5.2. Que dois-je faire pour les faire fonctionner dans Python 3.1?
Le codec hex
a été inséré dans les versions 3.x. Utilisez binascii
à la place:
>>> binascii.hexlify(b'hello')
b'68656c6c6f'
Vous avez déjà obtenu de bonnes réponses, mais j’ai pensé que vous pourriez aussi être intéressé par un peu d’arrière-plan.
Tout d'abord, vous manquez les citations. CA devrait etre:
"hello".encode("hex")
Deuxièmement, ce codec n'a pas été porté à Python 3.1. Voir ici . Il semble qu'ils n'aient pas encore décidé si ces codecs devraient ou non être inclus dans Python 3 ou mis en œuvre de manière différente.
Si vous regardez le fichier diff attaché à ce bogue, vous pouvez voir la méthode proposée pour le mettre en œuvre:
import binascii
output = binascii.b2a_hex(input)
les méthodes binascii sont plus faciles d'ailleurs
>>> import binascii
>>> x=b'test'
>>> x=binascii.hexlify(x)
>>> x
b'74657374'
>>> y=str(x,'ascii')
>>> y
'74657374'
>>> x=binascii.unhexlify(x)
>>> x
b'test'
>>> y=str(x,'ascii')
>>> y
'test'
J'espère que ça aide. :)
En Python 3, encodez la chaîne en octets et utilisez la méthode hex()
, en renvoyant une chaîne.
s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'
Convertissez éventuellement la chaîne en octets:
b = bytes(s, "utf-8")
b
# b'68656c6c6f'
En Python 3, toutes les chaînes sont unicode. En général, si vous codez un objet unicode en chaîne, vous utilisez .encode('TEXT_ENCODING')
, étant donné que hex
n'est pas un codage de texte, vous devez utiliser codecs.encode()
pour gérer les codecs arbitraires. Par exemple:
>>>> "hello".encode('hex')
LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>>> import codecs
>>>> codecs.encode(b"hello", 'hex')
b'68656c6c6f'
De nouveau, puisque "hello" est unicode, vous devez l'indiquer sous forme de chaîne d'octet avant de l'encoder en hexadécimal. Cela correspond peut-être davantage à votre approche originale consistant à utiliser la méthode encode
.
Les différences entrebinascii.hexlify
etcodecs.encode
sont les suivantes:
binascii.hexlify
Représentation hexadécimale de données binaires.
La valeur de retour est un objet octet.
Type: builtin_function_or_method
codecs.encode
encode (obj, [encoding [ errors]]) -> objet
Encode obj en utilisant le codec enregistré pour l'encodage. encoding defaultà l'encodage par défaut. des erreurs peuvent être générées pour définir un schéma de traitement d'erreur différent. La valeur par défaut est 'strict', ce qui signifie que les erreurs de codage génèrent Une valeur d'erreur. Les autres valeurs possibles sont 'ignore', 'replace' et 'Xmlcharrefreplace', ainsi que tout autre nom enregistré avec Codecs.register_error pouvant gérer ValueErrors.
Type: builtin_function_or_method
base64.b16encode
et base64.b16decode
convertir les octets vers et depuis hex et fonctionne avec toutes les versions de Python. L'approche codecs fonctionne également, mais est moins simple en Python 3.
Utilisez hexlify - http://epydoc.sourceforge.net/stdlib/binascii-module.html
Encore une autre méthode:
s = 'hello'
h = ''.join([hex(ord(i)) for i in s]);
# outputs: '0x680x650x6c0x6c0x6f'
Cela divise essentiellement la chaîne en caractères, effectue la conversion via hex(ord(char))
et réunit les caractères. Si vous souhaitez obtenir le résultat sans le préfixe 0x
, procédez comme suit:
h = ''.join([str(hex(ord(i)))[2:4] for i in s]);
# outputs: '68656c6c6f'
Testé avec Python 3.5.3.
La manière la plus simple de le faire dans Python 3.x est la suivante:
>>> 'halo'.encode().hex()
'68616c6f'
Si vous entrez manuellement une chaîne dans un interpréteur Python en utilisant les caractères utf-8
, vous pouvez le faire encore plus rapidement en tapant b
avant la chaîne:
>>> b'halo'.hex()
'68616c6f'
Equivalent en Python 2.x:
>>> 'halo'.encode('hex')
'68616c6f'