web-dev-qa-db-fra.com

Python 3.1.1 chaîne à hex

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?

50
Stuart

Le codec hex a été inséré dans les versions 3.x. Utilisez binascii à la place:

>>> binascii.hexlify(b'hello')
b'68656c6c6f'
68

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)
20
Mark Byers

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. :)

17
iMagur

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'
10
pylang

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.hexlifyetcodecs.encodesont 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

7
Devy

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.

6
Gabriel
3
Ofir

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.

0
Francis Laclé

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'
0
simhumileco