Najlepsze rozwiązanie dla mnie (działa z Pythonem 3), ponieważ akceptuje nawet spacje:bytearray.fromhex("70 61 75 6C").decode()
Jona,
bytearray.fromhex ("70e4756c"). decode (encoding = "Latin1") 'päul' Dla tych z nas, którzy grają w formacie binarnym, rozszerzone znaki dławią się przy domyślnym dekodowaniu utf-8, poza tym jest to najbardziej przenośna odpowiedź Widzę! Dzięki!
grambo
Oczywiście musisz znać faktyczne kodowanie danych, jeśli mają być interpretowane jako tekst. Użycie 'latin-1'pozbędzie się wszelkich błędów, ale może spowodować kompletny bełkot, jeśli tekst nie jest w rzeczywistości Latin-1.
tripleee
43
>>> txt ='7061756c'>>>''.join([chr(int(''.join(c),16))for c in zip(txt[0::2],txt[1::2])])'paul'
Po prostu dobrze się bawię, ale najważniejsze części to:
Oto moje rozwiązanie podczas pracy z liczbami szesnastkowymi, a nie ciągami szesnastkowymi:
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 na użyteczny przykład, ale nie konwertujesz „hex” jako wejścia, ale konwertujesz dowolną liczbę całkowitą na ciąg szesnastkowy. Twój kod będzie działał równie dobrze z print convert_hex_to_ascii(123456).
Mark Lakata
5
Alternatywnie możesz też zrobić to ...
Python 2 Interpreter
print"\x70 \x61 \x75 \x6c"
Przykład
user@linux:~# python
Python2.7.14+(default,Mar132018,15:23:44)[GCC 7.3.0] on linux2
Type"help","copyright","credits"or"license"for more information.>>>print"\x70 \x61 \x75 \x6c"
p a u l
>>> exit()
user@linux:~#
lub
Python 2 One-Liner
python -c 'print "\x70 \x61 \x75 \x6c"'
Przykład
user@linux:~# python -c 'print "\x70 \x61 \x75 \x6c"'
p a u l
user@linux:~#
Python 3 Interpreter
user@linux:~$ python3
Python3.6.9(default,Apr182020,01:56:04)[GCC 8.4.0] on linux
Type"help","copyright","credits"or"license"for more information.>>>print("\x70 \x61 \x75 \x6c")
p a u l
>>>print("\x70\x61\x75\x6c")
paul
Python 3 One-Liner
python -c 'print("\x70 \x61 \x75 \x6c")'
Przykład
user@linux:~$ python -c 'print("\x70 \x61 \x75 \x6c")'
p a u l
user@linux:~$ python -c 'print("\x70\x61\x75\x6c")'
paul
Działa to dobrze również bez spacji i działa dobrze w python3 z print ().
rjferguson
Tak, umieściłem to celowo, żeby było lepiej widoczne. Pozwólcie, że zaktualizuję odpowiedź również w Pythonie 3.
Sabrina
3
Przetestowane w Pythonie 3.3.2 Jest wiele sposobów, aby to osiągnąć, oto jeden z najkrótszych, wykorzystujący wyłącznie elementy dostarczane przez Pythona:
Odpowiedzi:
Nieco prostsze rozwiązanie:
źródło
.decode('hex')
w Pythonie 3..decode('hex')
zastosowańbinascii.unhexlify()
w Pythonie 2 .codecs.decode("7061756c", "hex")
działa dla Pythona 2 i Pythona 3. Ale zwracabytes()
łańcuch w Pythonie 3. Ale jest to rozsądne dla łańcucha ASCII.Nie ma potrzeby importowania żadnej biblioteki:
źródło
bytearray.fromhex("70 61 75 6C").decode()
'latin-1'
pozbędzie się wszelkich błędów, ale może spowodować kompletny bełkot, jeśli tekst nie jest w rzeczywistości Latin-1.Po prostu dobrze się bawię, ale najważniejsze części to:
spojrzy teraz na binascii ...
fajnie (i nie mam pojęcia, dlaczego inni chcą cię zmusić do skakania przez obręcze, zanim pomogą).
źródło
W Pythonie 2:
W Pythonie 3:
źródło
Oto moje rozwiązanie podczas pracy z liczbami szesnastkowymi, a nie ciągami szesnastkowymi:
źródło
print convert_hex_to_ascii(123456)
.Alternatywnie możesz też zrobić to ...
Python 2 Interpreter
Przykład
lub
Python 2 One-Liner
Przykład
Python 3 Interpreter
Python 3 One-Liner
Przykład
źródło
Przetestowane w Pythonie 3.3.2 Jest wiele sposobów, aby to osiągnąć, oto jeden z najkrótszych, wykorzystujący wyłącznie elementy dostarczane przez Pythona:
Oczywiście, jeśli nie chcesz niczego importować, zawsze możesz napisać własny kod. Coś bardzo podstawowego, takiego:
źródło
używaj go bez ogranicznika
źródło