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".
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".
Nieco prostsze rozwiązanie:
>>> "7061756c".decode("hex")
'paul'
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
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
'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. –
>>> 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ą).
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)
+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)'. –
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)
Nie trzeba importować żadnych Biblioteka:
>>> bytearray.fromhex("7061756c").decode()
'paul'
Najlepsze rozwiązanie dla mnie (działa z pythonem 3), ponieważ akceptuje spacje: 'bytearray.fromhex (" 70 61 75 6C "). Decode()' – Jona
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
Próbowałem kilka rzeczy znalazłem tutaj: http://docs.python.org/library/ binascii.html –
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? –
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 >> > –