Como posso converter de hexadecimal para ASCII simples em Python?
Observe que, por exemplo, desejo converter "0x7061756c" para "paul".
Como posso converter de hexadecimal para ASCII simples em Python?
Observe que, por exemplo, desejo converter "0x7061756c" para "paul".
Respostas:
Uma solução um pouco mais simples:
>>> "7061756c".decode("hex")
'paul'
.decode('hex')
no Python 3. .decode('hex')
usos binascii.unhexlify()
no Python 2 .
codecs.decode("7061756c", "hex")
funciona para Python 2 e Python 3. Mas ele retorna uma bytes()
string no Python 3. Mas isso é razoável para uma string ASCII.
Não há necessidade de importar nenhuma biblioteca:
>>> bytearray.fromhex("7061756c").decode()
'paul'
bytearray.fromhex("70 61 75 6C").decode()
'latin-1'
irá livrar-se de quaisquer erros, mas poderá produzir uma rabiscos completos se o texto não for realmente latino-1.
>>> txt = '7061756c'
>>> ''.join([chr(int(''.join(c), 16)) for c in zip(txt[0::2],txt[1::2])])
'paul'
estou apenas me divertindo, mas as partes importantes são:
>>> 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
' '
vai olhar para binascii agora ...
>>> print binascii.unhexlify('7061756c')
paul
legal (e eu não tenho idéia do por que outras pessoas querem fazer você pular em círculos antes que elas ajudem).
Aqui está minha solução ao trabalhar com números inteiros hexadecimais e não cadeias hexadecimais:
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)
print convert_hex_to_ascii(123456)
.
Como alternativa, você também pode fazer isso ...
Intérprete Python 2
print "\x70 \x61 \x75 \x6c"
Exemplo
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
One-Liner para Python 2
python -c 'print "\x70 \x61 \x75 \x6c"'
Exemplo
user@linux:~# python -c 'print "\x70 \x61 \x75 \x6c"'
p a u l
user@linux:~#
Intérprete 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
One-Liner para Python 3
python -c 'print("\x70 \x61 \x75 \x6c")'
Exemplo
user@linux:~$ python -c 'print("\x70 \x61 \x75 \x6c")'
p a u l
user@linux:~$ python -c 'print("\x70\x61\x75\x6c")'
paul
Testado no Python 3.3.2 Há muitas maneiras de conseguir isso, eis uma das mais curtas, usando apenas o material fornecido pelo python:
import base64
hex_data ='57696C6C20796F7520636F6E76657274207468697320484558205468696E6720696E746F20415343494920666F72206D653F2E202E202E202E506C656565656173652E2E2E212121'
ascii_string = str(base64.b16decode(hex_data))[2:-1]
print (ascii_string)
Obviamente, se você não deseja importar nada, sempre pode escrever seu próprio código. Algo muito básico assim:
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)