2012-03-09 18 views
93

Jak przekonwertować z języka heksadecymalnego na zwykły kod ASCII w języku Python?Konwertuj z łańcucha ASCII zakodowanego w szesnastkowy na zwykły ASCII?

Należy pamiętać, że na przykład chcę przekonwertować "0x7061756c" na "paul".

+0

Próbowałem kilka rzeczy znalazłem tutaj: http://docs.python.org/library/ binascii.html –

+1

Za pomocą linku, który właśnie nam dałeś, znalazłem funkcję, której szukałeś. Co _exactly_ próbowałeś i dlaczego to nie zadziałało? –

+0

Próbowałem następujące: >>> 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 (najnowsza wezwanie ostatni): Plik" ”, wiersz 1, w TypeError: musi być ciąg znaków lub bufor, nie int >> > –

Odpowiedz

177

Nieco prostsze rozwiązanie:

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

nie ma '.decode ('hex')' na Pythonie 3. ['.decode ('hex')' używa 'binascii.unhexlify()' na Pythonie 2] (http://hg.python.org/cpython/file/2.7/Lib/encodings/hex_codec.py#l27). – jfs

+1

Dzięki za wskazanie, że nie jestem tak dobrze zaznajomiony z Pythonem 3. To rozwiązanie również nie zadziała w 1 o ile mi wiadomo. – cjm

+11

'codecs.decode (" 7061756c "," hex ")' działa dla Pythona 2 i Pythona 3. Ale zwraca ciąg 'bytes()' w Pythonie 3. Ale jest to uzasadnione dla ciągu ASCII. –

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

jestem tylko zabawy, ale ważne elementy to:

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

będą patrzeć na binascii teraz ...

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

fajne (i nie mam pojęcia dlaczego inni chcą, abyś przeskoczył przez obręcze, zanim ci pomogą).

4

Oto moje rozwiązanie podczas pracy z liczb hex i nie hex strun:

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 dla użytecznego przykładu, ale nie konwertujesz "hex" jako danych wejściowych, ale konwertujesz jakąkolwiek liczbę całkowitą na ciąg szesnastkowy. Twój kod będzie działać równie dobrze z 'print convert_hex_to_ascii (123456)'. –

3

Testowany w Pythonie 3.3.2 Istnieje wiele sposobów, aby tego dokonać , tutaj jest jeden z najkrótszych, używając tylko materiałów dostarczonych przez pytona:

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

Oczywiście, jeśli nie chcesz importować czegokolwiek, zawsze możesz napisać swój własny kod. Coś bardzo podstawowe tak:

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

Nie trzeba importować żadnych Biblioteka:

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

Najlepsze rozwiązanie dla mnie (działa z pythonem 3), ponieważ akceptuje spacje: 'bytearray.fromhex (" 70 61 75 6C "). Decode()' – Jona

+0

bytearray.fromhex ("70e4756c"). Decode (encoding = "Latin1 ") 'päul' Dla tych z nas, grających w systemie binarnym, rozszerzone znaki dławią się na domyślnym dekoderze utf-8, poza tym jest to najbardziej przenośna odpowiedź, jaką widzę! Dzięki! – grambo