¿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".
¿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".
Una solución un poco más sencillo:
>>> "7061756c".decode("hex")
'paul'
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
Gracias por señalarlo, no estoy tan familiarizado con Python 3. Esta solución tampoco funcionará en 1 por lo que sé. – cjm
'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. –
>>> 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).
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)
+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)'. –
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)
No hay necesidad de importar cualquier biblioteca:
>>> bytearray.fromhex("7061756c").decode()
'paul'
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 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
he intentado un montón de cosas que encontré aquí: http://docs.python.org/library/ binascii.html –
Con la ayuda del enlace que acaba de proporcionarnos, encontré la función que estaba buscando. ¿Qué _exactamente_ intentaste y por qué no funcionó? –
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 >> > –