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".

Paul Reiners
sumber
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'
cjm
sumber
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'
pengguna4369081
sumber
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).

andrew cooke
sumber
16

Dengan Python 2:

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

Dengan Python 3:

>>> bytes.fromhex('7061756c').decode('utf-8')
'paul'
Julien
sumber
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)
carloserivera
sumber
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
Sabrina
sumber
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)
Victor Barrantes
sumber
1
b''.fromhex('7061756c')

gunakan tanpa pembatas

Serak
sumber