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 >>>

5voto

Sabrina Points 409

Vous pouvez aussi le faire...

Interpréteur Python 2

print "\x70 \x61 \x75 \x6c"

Exemple

user@linux:~# python
Python 2.7.14+ (default, Mar 13 2018, 15:23:44) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> print "\x70 \x61 \x75 \x6c"
p a u l
>>> exit()
user@linux:~# 

ou

Python 2 One-Liner

python -c 'print "\x70 \x61 \x75 \x6c"'

Exemple

user@linux:~# python -c 'print "\x70 \x61 \x75 \x6c"'
p a u l
user@linux:~# 

Interpréteur Python 3

user@linux:~$ python3
Python 3.6.9 (default, Apr 18 2020, 01:56:04) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> print("\x70 \x61 \x75 \x6c")
p a u l

>>> print("\x70\x61\x75\x6c")
paul

Python 3 One-Liner

python -c 'print("\x70 \x61 \x75 \x6c")'

Exemple

user@linux:~$ python -c 'print("\x70 \x61 \x75 \x6c")'
p a u l

user@linux:~$ python -c 'print("\x70\x61\x75\x6c")'
paul

2 votes

Cela fonctionne bien sans les espaces également, et fonctionne bien dans python3 avec print().

1 votes

Oui, je l'ai mis exprès pour que ce soit plus facile à voir. Je vais mettre à jour la réponse avec Python 3 également.

5voto

carloserivera Points 73

Voici ma solution lorsque je travaille avec des entiers hexagonaux et non des chaînes hexagonales :

def convert_hex_to_ascii(h):
    chars_in_reverse = []
    while h != 0x0:
        chars_in_reverse.append(chr(h & 0xFF))
        h = h >> 8

    chars_in_reverse.reverse()
    return ''.join(chars_in_reverse)

print convert_hex_to_ascii(0x7061756c)

0 votes

+1 pour un exemple utile, mais vous ne convertissez pas "hex" comme entrée mais vous convertissez n'importe quel nombre entier en une chaîne hex. Votre code fonctionnera tout aussi bien avec print convert_hex_to_ascii(123456) .

5voto

Victor Barrantes Points 173

Testé en Python 3.3.2 Il existe de nombreuses façons d'accomplir cette tâche, voici l'une des plus courtes, qui n'utilise que des éléments fournis par Python :

import base64
hex_data ='57696C6C20796F7520636F6E76657274207468697320484558205468696E6720696E746F20415343494920666F72206D653F2E202E202E202E506C656565656173652E2E2E212121'
ascii_string = str(base64.b16decode(hex_data))[2:-1]
print (ascii_string)

Bien sûr, si vous ne voulez rien importer, vous pouvez toujours écrire votre propre code. Quelque chose de très basique comme ceci :

ascii_string = ''
x = 0
y = 2
l = len(hex_data)
while y <= l:
    ascii_string += chr(int(hex_data[x:y], 16))
    x += 2
    y += 2
print (ascii_string)

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