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?
9 réponses
le hex
codec a été glissé en 3.x. Utiliser binascii
à la place:
>>> binascii.hexlify(b'hello')
b'68656c6c6f'
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)
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. :)
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'
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.
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
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.
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