182 votes

Convertir une chaîne de caractères ASCII encodée en hexadécimal en ASCII brut ?

Comment puis-je convertir un hexagone en ASCII en Python ?

Notez que, par exemple, je veux convertir "0x7061756c" en "paul".

0 votes

J'ai essayé un tas de trucs que j'ai trouvés ici : docs.python.org/library/binascii.html

2 votes

Avec l'aide du lien que vous venez de nous donner, j'ai trouvé la fonction que vous recherchiez. Qu'est-ce que exactement avez-vous essayé et pourquoi cela n'a-t-il pas fonctionné ?

1 votes

J'ai essayé ce qui suit : >>> binascii.b2a_hqx("0x7061756c") '-(Jh-$Ba0c8fB`' >>> binascii.b2a_uu("0x7061756c") '*,'@W,#8Q-S4V8P \n " >>> binascii.b2a_base64("0x7061756c") 'MHg3MDYxNzU2Yw== \n ' >>> binascii.b2a_qp("0x7061756c") '0x7061756c' >>> binascii.b2a_hex("0x7061756c") '30783730363137353663' >>> binascii.b2a_hex(0x7061756c) Traceback (dernier appel le plus récent) : Fichier "<stdin>", ligne 1, dans <module> TypeError : must be string or buffer, not int >>>

249voto

cjm Points 1321

Une solution un peu plus simple :

>>> "7061756c".decode("hex")
'paul'

183 votes

Il n'y a pas .decode('hex') sur Python 3. .decode('hex') utilise binascii.unhexlify() sur Python 2 .

2 votes

Merci de le signaler, je ne suis pas aussi familier avec Python 3. Cette solution ne fonctionnera pas non plus en 1 pour autant que je sache.

29 votes

codecs.decode("7061756c", "hex") fonctionne pour Python 2 et Python 3. Mais il renvoie un bytes() en Python 3. Mais c'est raisonnable pour une chaîne ASCII.

152voto

user4369081 Points 1301

Il n'est pas nécessaire d'importer une bibliothèque :

>>> bytearray.fromhex("7061756c").decode()
'paul'

5 votes

La meilleure solution pour moi (fonctionne avec python 3) car elle accepte même les espaces : bytearray.fromhex("70 61 75 6C").decode()

0 votes

Bytearray.fromhex("70e4756c").decode(encoding="Latin1") 'päul' Pour ceux d'entre nous qui jouent en binaire, les caractères étendus s'étouffent avec le décodage utf-8 par défaut, sinon, c'est la réponse la plus portable que je vois ! Merci !

1 votes

Bien sûr, vous devez connaître le réel codage des données si elles doivent être interprétées comme du texte. Utilisation de 'latin-1' éliminera toutes les erreurs mais risque de produire un charabia complet si le texte n'est pas en latin-1.

51voto

andrew cooke Points 20902
>>> txt = '7061756c'
>>> ''.join([chr(int(''.join(c), 16)) for c in zip(txt[0::2],txt[1::2])])
'paul'                                                                          

Je m'amuse juste, mais les parties importantes sont :

>>> int('0a',16)         # parse hex
10
>>> ''.join(['a', 'b'])  # join characters
'ab'
>>> 'abcd'[0::2]         # alternates
'ac'
>>> zip('abc', '123')    # pair up
[('a', '1'), ('b', '2'), ('c', '3')]        
>>> chr(32)              # ascii to character
' '

Je vais regarder binascii maintenant...

>>> print binascii.unhexlify('7061756c')
paul

cool (et je n'ai aucune idée de la raison pour laquelle d'autres personnes veulent vous faire sauter à travers des cerceaux avant de vous aider).

40voto

Julien Points 609

Dans Python 2 :

>>> "7061756c".decode("hex")
'paul'

Dans Python 3 :

>>> bytes.fromhex('7061756c').decode('utf-8')
'paul'

6voto

Husky Points 41
b''.fromhex('7061756c')

utilisez-le sans délimiteur

0 votes

Ce n'est pas différent de bytes.fromhex() ou bytearray.fromhex() . Pour ces deux types, .fromhex() est une méthode de classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X