2012-03-09 31 views
93

¿Cómo puedo convertir de hexadecimal a simple ASCII en Python?¿Convertir de cadena ASCII codificada en hexadecimal a ASCII simple?

Tenga en cuenta que, por ejemplo, quiero convertir "0x7061756c" en "paul".

+0

he intentado un montón de cosas que encontré aquí: http://docs.python.org/library/ binascii.html –

+1

Con la ayuda del enlace que acaba de proporcionarnos, encontré la función que estaba buscando. ¿Qué _exactamente_ intentaste y por qué no funcionó? –

+0

He intentado lo siguiente: >>> 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) Rastreo (llamada más reciente pasado): archivo" ", línea 1, en TypeError: debe ser de cadena o búfer, no int >> > –

Respuesta

177

Una solución un poco más sencillo:

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

no hay '.decode ('hex')' en Python 3. ['.decode ('hex')' utiliza 'binascii.unhexlify()' en Python 2] (http://hg.python.org/cpython/file/2.7/Lib/encodings/hex_codec.py#l27). – jfs

+1

Gracias por señalarlo, no estoy tan familiarizado con Python 3. Esta solución tampoco funcionará en 1 por lo que sé. – cjm

+11

'codecs.decode (" 7061756c "," hex ")' funciona para Python 2 y Python 3. Pero devuelve una cadena 'bytes()' en Python 3. Pero eso es razonable para una cadena ASCII. –

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

estoy divirtiendo, pero las partes importantes son:

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

mirarán binascii ahora ...

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

fresco (y no tengo ni idea de por qué otras personas quieren hacerte saltar por los aros antes de que te ayuden).

4

Aquí está mi solución cuando se trabaja con números enteros hexagonales y las cadenas no Hex:

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

+1 para un ejemplo útil, pero no está convirtiendo "hex" como la entrada, pero está convirtiendo cualquier entero en una cadena hexadecimal. Tu código funcionará igual de bien con 'print convert_hex_to_ascii (123456)'. –

3

Probado en Python 3.3.2 Hay muchas maneras de lograr esto , aquí está uno de los más cortos, usando solo cosas proporcionadas por Python:

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

Por supuesto, si no quiere importar nada, siempre puede escribir su propio código. Algo muy básico como esto:

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

No hay necesidad de importar cualquier biblioteca:

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

La mejor solución para mí (funciona con python 3) ya que incluso acepta espacios: 'bytearray.fromhex (" 70 61 75 6C "). Decode()' – Jona

+0

bytearray.fromhex ("70e4756c"). Decode (encoding = "Latin1 ") 'päul' Para aquellos de nosotros que estamos jugando 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 que veo! ¡Gracias! – grambo

Cuestiones relacionadas