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".
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".
Una soluzione un po 'più semplice:
>>> "7061756c".decode("hex")
'paul'
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
Grazie per averlo sottolineato, non ho familiarità con Python 3. Anche questa soluzione non funzionerà in 1 per quanto ne so. – cjm
'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. –
>>> 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).
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)
+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)'. –
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)
Non c'è bisogno di importare qualsiasi libreria:
>>> bytearray.fromhex("7061756c").decode()
'paul'
La migliore soluzione per me (funziona con python 3) in quanto accetta anche spazi: 'bytearray.fromhex (" 70 61 75 6C "). Decode()' – Jona
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
Ho provato un sacco di roba che ho trovato qui: http://docs.python.org/library/ binascii.html –
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? –
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 >> > –