2012-03-09 17 views
93

Come posso convertire da hex a plain ASCII in Python?Converti da stringa ASCII codificata in Hex in ASCII normale?

Si noti che, ad esempio, voglio convertire "0x7061756c" in "paul".

+0

Ho provato un sacco di roba che ho trovato qui: http://docs.python.org/library/ binascii.html –

+1

Con l'aiuto del link che ci hai appena dato, ho trovato la funzione che stavi cercando. Che cosa esattamente hai provato e perché non ha funzionato? –

+0

Ho provato quanto segue: >>> 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 (chiamata più recente scorso): file" ", linea 1, in TypeError: deve essere stringa o di buffer, non int >> > –

risposta

177

Una soluzione un po 'più semplice:

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

non c'è '.decode (' hex ')' su Python 3. ['.decode (' hex ')' utilizza 'binascii.unhexlify()' su Python 2] (http://hg.python.org/cpython/file/2.7/Lib/encodings/hex_codec.py#l27). – jfs

+1

Grazie per averlo sottolineato, non ho familiarità con Python 3. Anche questa soluzione non funzionerà in 1 per quanto ne so. – cjm

+11

'codecs.decode (" 7061756c "," hex ")' funziona per Python 2 e Python 3. Ma restituisce una stringa 'bytes()' in Python 3. Ma è ragionevole per una stringa ASCII. –

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

sto solo divertendo, ma le parti importanti sono:

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

guarderanno binascii ora ...

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

fresco (e non ho idea del perché le altre persone vogliono farti saltare attraverso i cerchi prima che possano aiutarti).

4

Ecco la mia soluzione quando si lavora con numeri interi e stringhe esadecimali non 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 per un esempio utile, ma non si sta convertendo "hex" come input ma si sta convertendo qualsiasi numero intero in una stringa esadecimale. Il codice funzionerà ugualmente con 'print convert_hex_to_ascii (123456)'. –

3

testato in Python 3.3.2 Ci sono molti modi per ottenere questo risultato , ecco uno dei più brevi, usando solo materiale fornito da python:

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

Naturalmente, se non vuoi importare nulla, puoi sempre scrivere il tuo codice. Qualcosa di molto semplice come questo:

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

Non c'è bisogno di importare qualsiasi libreria:

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

La migliore soluzione per me (funziona con python 3) in quanto accetta anche spazi: 'bytearray.fromhex (" 70 61 75 6C "). Decode()' – Jona

+0

bytearray.fromhex ("70e4756c"). Decodifica (codifica = "Latin1 ") 'päul' Per quelli di noi che giocano in binario, i caratteri estesi soffocano sulla decodifica utf-8 predefinita, a parte questo, questa è la risposta più portatile che vedo! Grazie! – grambo

Problemi correlati