Konversi dari string ASCII yang dikodekan dalam Hex ke ASCII biasa?


147

Bagaimana saya bisa mengkonversi dari hex ke ASCII dengan Python?

Perhatikan bahwa, misalnya, saya ingin mengonversi "0x7061756c" menjadi "paul".


Saya sudah mencoba banyak hal yang saya temukan di sini: docs.python.org/library/binascii.html
Paul Reiners

1
Dengan bantuan tautan yang baru saja Anda berikan kepada kami, saya menemukan fungsi yang Anda cari. Apa sebenarnya yang Anda coba dan mengapa itu tidak berhasil?
Vincent Savard

1
Saya mencoba yang berikut ini: >>> 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.b2a3b3g3c33030330303303bbc3b3bbc3b3b3bc3g3bc3b3b3c3b3b3b3g3b3b3b3g3bcbnbbbfbbfpnnnnnnnnnnnnnnnnnnnng3b3bnbnn .b2a_hex (0x7061756c) Traceback (panggilan terakhir terakhir): File "<stdin>", baris 1, dalam <module> TypeError: harus berupa string atau buffer, bukan int >>>
Paul Reiners

Tak satu pun dari mereka yang bekerja, karena tak satu pun dari mereka mengembalikan 'paul'.
Paul Reiners

2
Bukankah maksud Anda "7-bit" ASCII? (Yang agak konyol karena ASCII hanya 7-bit.) GUID adalah 128bits ...

Jawaban:


231

Solusi yang sedikit lebih sederhana:

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

143
tidak ada .decode('hex')pada Python 3. .decode('hex')digunakan binascii.unhexlify()pada Python 2 .
jfs

2
Terima kasih telah menunjukkan itu, saya tidak terbiasa dengan Python 3. Solusi ini juga tidak akan berfungsi dalam 1 sejauh yang saya tahu.
cjm

27
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.
Mark Evans

101

Tidak perlu mengimpor perpustakaan apa pun:

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

2
Solusi terbaik untuk saya (bekerja dengan python 3) karena bahkan menerima spasi:bytearray.fromhex("70 61 75 6C").decode()
Jona

bytearray.fromhex ("70e4756c"). decode (encoding = "Latin1") 'päul' Bagi kita yang bermain dalam biner, karakter yang diperluas tersedak oleh decode utf-8 default, selain itu, ini adalah jawaban yang paling portabel Saya melihat! Terima kasih!
grambo

Tentu saja Anda harus tahu yang sebenarnya pengkodean data jika itu harus ditafsirkan sebagai teks. Menggunakan 'latin-1'akan menghilangkan kesalahan tetapi mungkin menghasilkan omong kosong lengkap jika teksnya tidak benar-benar Latin-1.
tripleee

43
>>> 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).


16

Dengan Python 2:

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

Dengan Python 3:

>>> bytes.fromhex('7061756c').decode('utf-8')
'paul'

5

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)

Memberi +1 untuk contoh yang bermanfaat, tetapi Anda tidak mengonversi "hex" sebagai input tetapi Anda mengonversi integer apa pun menjadi string hex. Kode Anda akan berfungsi sama baiknya dengan print convert_hex_to_ascii(123456).
Mark Lakata

5

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

2
Ini berfungsi baik tanpa spasi juga, dan berfungsi dengan baik di python3 dengan print ().
rjferguson

Ya, saya sengaja membuatnya lebih mudah dilihat. Biarkan saya memperbarui jawabannya dengan Python 3 juga.
Sabrina

3

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)

1
b''.fromhex('7061756c')

gunakan tanpa pembatas

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.