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é un tas de variantes et elles semblent toutes fonctionner en python 2.5.2, alors que dois-je faire pour qu'elles fonctionnent en Python 3.1?

48
demandé sur SilentGhost 2010-02-26 11:27:09

9 réponses

le hex codec a été glissé en 3.x. Utiliser binascii à la place:

>>> binascii.hexlify(b'hello')
b'68656c6c6f'
64
répondu Ignacio Vazquez-Abrams 2010-02-26 11:17:07

vous avez déjà de bonnes réponses, mais j'ai pensé que vous pourriez être intéressé par un peu de l'arrière-plan aussi.

tout d'abord, vous manquez les citations. Il devrait être:

"hello".encode("hex")

Deuxièmement, ce codec n'a pas été porté sur Python 3.1. Voir ici . Il semble qu'ils n'aient pas encore décidé si oui ou non ces codecs devraient être inclus dans Python 3 ou implémentés d'une manière différente.

si vous regardez le fichier diff attaché à ce bug, vous pouvez voir la méthode proposée pour le mettre en œuvre:

import binascii
output = binascii.b2a_hex(input)
19
répondu Mark Byers 2010-04-12 09:51:00

binascii methodes sont plus facile par la voie

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

17
répondu iMagur 2012-11-24 22:05:49

en Python 3, encodez la chaîne en octets et utilisez la méthode hex() , en retournant une chaîne.

s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'

convertissez optionnellement la chaîne en octets:

b = bytes(s, "utf-8")
b
# b'68656c6c6f'
7
répondu pylang 2017-06-13 01:03:33

base64.b16encode et base64.b16decode convertissez les octets vers et depuis hex et travaillez sur toutes les versions de Python. L'approche codecs fonctionne aussi, mais est moins simple en Python 3.

6
répondu Gabriel 2017-05-23 10:31:37

en Python 3, toutes les chaînes sont unicode. Habituellement, si vous encodez un objet unicode à une chaîne de caractères, vous utilisez .encode('TEXT_ENCODING') , puisque hex n'est pas un encodage de texte, vous devez utiliser codecs.encode() pour manipuler des 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'

, depuis le "bonjour" est unicode, vous devez l'indiquer comme une chaîne d'octets avant le codage en hexadécimal. Cela peut être plus en ligne avec ce que votre approche originale de l'utilisation de la méthode encode .

les différences entre binascii.hexlify et codecs.encode sont les suivantes:

  • binascii.hexlify

    représentation Hexadécimale de données binaires.

    la valeur de retour est un objet bytes.

    Type: builtin_fonction_or_method

  • codecs.code

    encode(obj, [encodage [erreurs]]) -> objet

    Code obj en utilisant le codec enregistré pour encodage. l'encodage par défaut pour le codage par défaut. des erreurs peuvent être données pour définir une erreur différente schéma de manipulation. Par défaut est "stricte" ce qui signifie que les erreurs d'encodage élever un ValueError. Les autres valeurs possibles sont 'ignorer', 'replace' et 'xmlcharrefreplace" ainsi que tout autre nom enregistré dans codec.register_error qui peut gérer ValueErrors.

    Type: builtin_fonction_or_method

6
répondu Devy 2015-09-01 23:41:09
3
répondu Ofir 2010-02-26 08:36:23

encore une autre méthode:

s = 'hello'

h = ''.join([hex(ord(i)) for i in s]);

# outputs: '0x680x650x6c0x6c0x6f'

cela divise fondamentalement la chaîne en chars, fait la conversion par hex(ord(char)) , et joint les chars de nouveau ensemble. Dans le cas où vous voulez le résultat sans le préfixe 0x puis faire:

h = ''.join([str(hex(ord(i)))[2:4] for i in s]);

# outputs: '68656c6c6f'

Testé avec Python 3.5.3.

0
répondu Francis Laclé 2018-02-12 03:33:48

2018 Solution:

def StrToHex(string):

    HEX = ""
    for x in string:HEX += hex(int(ord(x)))
    return HEX

print (StrToHex("HG"))

cette chaîne convertit en hexadécimal .

Note: Testé avec Python 3.6.1

0
répondu A - O 2018-06-12 12:47:11