Gracias por señalarlo, no estoy tan familiarizado con Python 3. Esta solución tampoco funcionará en 1 hasta donde yo sé.
cjm
27
codecs.decode("7061756c", "hex")funciona para Python 2 y Python 3. Pero devuelve una bytes()cadena en Python 3. Pero eso es razonable para una cadena ASCII.
La mejor solución para mí (funciona con Python 3) ya que incluso acepta espacios:bytearray.fromhex("70 61 75 6C").decode()
Jona
bytearray.fromhex ("70e4756c"). decode (encoding = "Latin1") 'päul' Para aquellos de nosotros que jugamos en binario, los caracteres extendidos se ahogan en la decodificación utf-8 predeterminada, aparte de eso, esta es la respuesta más portátil ¡Veo! ¡Gracias!
grambo
Por supuesto, debe conocer la codificación real de los datos si debe interpretarse como texto. El uso 'latin-1'eliminará cualquier error, pero puede producir un galimatías completo si el texto no es realmente latino-1.
tripleee
43
>>> txt ='7061756c'>>>''.join([chr(int(''.join(c),16))for c in zip(txt[0::2],txt[1::2])])'paul'
Me estoy divirtiendo, pero las partes importantes son:
Aquí está mi solución cuando trabajo con enteros hexadecimales y no con cadenas hexadecimales:
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)
+1 para un ejemplo útil, pero no está convirtiendo "hexadecimal" como entrada, sino que está convirtiendo cualquier número entero en una cadena hexadecimal. Tu código funcionará igual de bien con print convert_hex_to_ascii(123456).
Mark Lakata
5
Alternativamente, también puedes hacer esto ...
Python 2 Intérprete
print"\x70 \x61 \x75 \x6c"
Ejemplo
user@linux:~# pythonPython2.7.14+(default,Mar132018,15:23:44)[GCC 7.3.0] on linux2Type"help","copyright","credits"or"license"for more information.>>>print"\x70 \x61 \x75 \x6c"
p a u l>>> exit()
user@linux:~#
o
Python 2 One-Liner
python -c 'print "\x70 \x61 \x75 \x6c"'
Ejemplo
user@linux:~# python -c 'print "\x70 \x61 \x75 \x6c"'
p a u l
user@linux:~#
Python 3 Intérprete
user@linux:~$ python3Python3.6.9(default,Apr182020,01:56:04)[GCC 8.4.0] on linuxType"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")'
Ejemplo
user@linux:~$ python -c 'print("\x70 \x61 \x75 \x6c")'
p a u l
user@linux:~$ python -c 'print("\x70\x61\x75\x6c")'
paul
Respuestas:
Una solución un poco más simple:
fuente
.decode('hex')
en Python 3..decode('hex')
usosbinascii.unhexlify()
en Python 2 .codecs.decode("7061756c", "hex")
funciona para Python 2 y Python 3. Pero devuelve unabytes()
cadena en Python 3. Pero eso es razonable para una cadena ASCII.No es necesario importar ninguna biblioteca:
fuente
bytearray.fromhex("70 61 75 6C").decode()
'latin-1'
eliminará cualquier error, pero puede producir un galimatías completo si el texto no es realmente latino-1.Me estoy divirtiendo, pero las partes importantes son:
mirará a binascii ahora ...
genial (y no tengo idea de por qué otras personas quieren hacerte saltar a través de los aros antes de que ayuden).
fuente
En Python 2:
En Python 3:
fuente
Aquí está mi solución cuando trabajo con enteros hexadecimales y no con cadenas hexadecimales:
fuente
print convert_hex_to_ascii(123456)
.Alternativamente, también puedes hacer esto ...
Python 2 Intérprete
Ejemplo
o
Python 2 One-Liner
Ejemplo
Python 3 Intérprete
Python 3 One-Liner
Ejemplo
fuente
Probado en Python 3.3.2 Hay muchas maneras de lograr esto, esta es una de las más cortas, usando solo cosas proporcionadas por Python:
Por supuesto, si no desea importar nada, siempre puede escribir su propio código. Algo muy básico como este:
fuente
usarlo sin delimitador
fuente