2012-03-09 10 views
93

Làm cách nào để chuyển đổi từ hex sang ASCII thuần tuý bằng Python?Chuyển đổi từ chuỗi ASCII được mã hóa thành Hex thành ASCII thuần tuý?

Lưu ý rằng, ví dụ: tôi muốn chuyển đổi "0x7061756c" thành "paul".

+0

Tôi đã thử một bunch of stuff tôi tìm thấy ở đây: http://docs.python.org/library/ binascii.html –

+1

Với sự trợ giúp của liên kết bạn vừa cung cấp cho chúng tôi, tôi đã tìm thấy hàm bạn đang tìm kiếm. Bạn đã thử _exactly_ gì và tại sao nó không hoạt động? –

+0

Tôi đã thử những điều sau đây: >>> 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 (gần đây nhất gọi cuối cùng): file" ", dòng 1, trong Lỗi Loại: phải chuỗi hoặc đệm, không int >> > –

Trả lời

177

Một giải pháp đơn giản hơn một chút:

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

không có '.decode ('hex')' trên Python 3. ['.decode ('hex')' sử dụng 'binascii.unhexlify()' trên Python 2] (http://hg.python.org/cpython/file/2.7/Lib/encodings/hex_codec.py#l27). – jfs

+1

Cảm ơn bạn đã chỉ ra rằng, tôi không quen thuộc với Python 3. Giải pháp này cũng sẽ không hoạt động trong 1 theo như tôi biết. – cjm

+11

'codecs.decode (" 7061756c "," hex ")' hoạt động cho Python 2 và Python 3. Nhưng nó trả về một chuỗi 'byte()' trong Python 3. Nhưng đó là hợp lý đối với một chuỗi ASCII. –

39
>>> txt = '7061756c' 
>>> ''.join([chr(int(''.join(c), 16)) for c in zip(txt[0::2],txt[1::2])]) 
'paul'                   

Tôi chỉ có niềm vui, nhưng những phần quan trọng là:

>>> 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 
' ' 

sẽ xem xét binascii bây giờ ...

>>> print binascii.unhexlify('7061756c') 
paul 

mát mẻ (và tôi không có ý tưởng tại sao những người khác muốn làm cho bạn nhảy qua hoops trước khi họ sẽ giúp).

4

Đây là giải pháp của tôi khi làm việc với số nguyên hex và chuỗi không hex:

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) 
+0

+1 cho một ví dụ hữu ích, nhưng bạn không chuyển đổi "hex" làm đầu vào nhưng bạn đang chuyển đổi bất kỳ số nguyên nào thành chuỗi thập lục phân. Mã của bạn sẽ hoạt động như nhau với 'print convert_hex_to_ascii (123456)'. –

3

Tested bằng Python 3.3.2 Có rất nhiều cách để thực hiện điều này , đây là một trong những điều ngắn nhất, chỉ sử dụng các công cụ được cung cấp bằng python:

import base64 
hex_data ='57696C6C20796F7520636F6E76657274207468697320484558205468696E6720696E746F20415343494920666F72206D653F2E202E202E202E506C656565656173652E2E2E212121' 
ascii_string = str(base64.b16decode(hex_data))[2:-1] 
print (ascii_string) 

Tất nhiên, nếu bạn không muốn nhập bất cứ thứ gì, bạn luôn có thể viết mã của riêng bạn. Một cái gì đó rất cơ bản như thế này:

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) 
41

Không cần phải nhập khẩu bất kỳ thư viện:

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

Giải pháp tốt nhất cho tôi (làm việc với python 3) vì nó thậm chí chấp nhận không gian: 'bytearray.fromhex (" 70 61 75 6C ") giải mã()' – Jona

+0

bytearray.fromhex ("70e4756c"). Decode (encoding = "Latin1 ") 'päul' Đối với những người chơi trò chơi nhị phân, các ký tự mở rộng bị tắt trên giải mã utf-8 mặc định, ngoài ra, đây là câu trả lời di động nhất mà tôi thấy! Cảm ơn! – grambo