Bagaimana saya bisa mengkonversi dari hex ke ASCII dengan Python?
Perhatikan bahwa, misalnya, saya ingin mengonversi "0x7061756c" menjadi "paul".
Bagaimana saya bisa mengkonversi dari hex ke ASCII dengan Python?
Perhatikan bahwa, misalnya, saya ingin mengonversi "0x7061756c" menjadi "paul".
Jawaban:
Solusi yang sedikit lebih sederhana:
>>> "7061756c".decode("hex")
'paul'
.decode('hex')
pada Python 3. .decode('hex')
digunakan binascii.unhexlify()
pada Python 2 .
codecs.decode("7061756c", "hex")
berfungsi untuk Python 2 dan Python 3. Tapi mengembalikan bytes()
string dengan Python 3. Tapi itu masuk akal untuk string ASCII.
Tidak perlu mengimpor perpustakaan apa pun:
>>> bytearray.fromhex("7061756c").decode()
'paul'
bytearray.fromhex("70 61 75 6C").decode()
'latin-1'
akan menghilangkan kesalahan tetapi mungkin menghasilkan omong kosong lengkap jika teksnya tidak benar-benar Latin-1.
>>> txt = '7061756c'
>>> ''.join([chr(int(''.join(c), 16)) for c in zip(txt[0::2],txt[1::2])])
'paul'
Saya hanya bersenang-senang, tetapi bagian-bagian penting adalah:
>>> 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
' '
akan melihat binascii sekarang ...
>>> print binascii.unhexlify('7061756c')
paul
keren (dan saya tidak tahu mengapa orang lain ingin membuat Anda melompat melalui lingkaran sebelum mereka akan membantu).
Inilah solusi saya ketika bekerja dengan hex integer dan bukan hex string:
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)
print convert_hex_to_ascii(123456)
.
Atau, Anda juga dapat melakukan ini ...
Penerjemah Python 2
print "\x70 \x61 \x75 \x6c"
Contoh
user@linux:~# python
Python 2.7.14+ (default, Mar 13 2018, 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:~#
atau
Python 2 One-Liner
python -c 'print "\x70 \x61 \x75 \x6c"'
Contoh
user@linux:~# python -c 'print "\x70 \x61 \x75 \x6c"'
p a u l
user@linux:~#
Penerjemah Python 3
user@linux:~$ python3
Python 3.6.9 (default, Apr 18 2020, 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")'
Contoh
user@linux:~$ python -c 'print("\x70 \x61 \x75 \x6c")'
p a u l
user@linux:~$ python -c 'print("\x70\x61\x75\x6c")'
paul
Diuji dengan Python 3.3.2 Ada banyak cara untuk mencapai ini, inilah salah satu yang terpendek, hanya menggunakan hal-hal yang disediakan python:
import base64
hex_data ='57696C6C20796F7520636F6E76657274207468697320484558205468696E6720696E746F20415343494920666F72206D653F2E202E202E202E506C656565656173652E2E2E212121'
ascii_string = str(base64.b16decode(hex_data))[2:-1]
print (ascii_string)
Tentu saja, jika Anda tidak ingin mengimpor apa pun, Anda selalu dapat menulis kode Anda sendiri. Sesuatu yang sangat mendasar seperti ini:
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)