从十六进制编码的ASCII字符串转换为纯ASCII?


146

如何在Python中将十六进制转换为纯ASCII?

请注意,例如,我要将“ 0x7061756c”转换为“ paul”。


我已经尝试了很多在这里找到的东西:docs.python.org/library/binascii.html
Paul Reiners

1
在您刚刚给我们的链接的帮助下,我找到了您想要的功能。您到底尝试了什么,为什么不起作用?
Vincent Savard'3

1
我尝试了以下操作:>>> 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> 363'307'663> 307 .b2a_hex(0x7061756c)追溯(最近一次调用为最新):文件“ <stdin>”,在<module>中的第1行,TypeError:必须是字符串或缓冲区,而不是int >>>
Paul Reiners 2012年

他们都没有工作,因为他们都没有返回“保罗”。
Paul Reiners 2012年

2
您不是指“ 7位” ASCII吗?(这有点愚蠢,因为ASCII只有7位。)GUID是128位...

Answers:



100

无需导入任何库:

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

2
对我来说最好的解决方案(适用于python 3),因为它甚至可以接受空格:bytearray.fromhex("70 61 75 6C").decode()
Jona

bytearray.fromhex(“ 70e4756c”)。decode(encoding =“ Latin1”)'päul'对于我们这些以二进制方式播放的用户而言,扩展字符在默认的utf-8解码上cho不休,除此之外,这是最可移植的答案我懂了!谢谢!
grambo

当然,如果要将数据解释为文本,则必须知道数据的实际编码。使用'latin-1'将消除任何错误,但如果文本实际上不是Latin-1,则可能会产生完全的乱码。
三人房

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

我只是很开心,但重要的部分是:

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

现在将看Binascii ...

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

很酷(而且我不知道为什么其他人想让您跳入困境,然后他们才会帮助您)。


16

在Python 2中:

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

在Python 3中:

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

5

这是使用十六进制整数而不是十六进制字符串时的解决方案:

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是一个有用的示例,但是您没有将“ hex”转换为输入,而是将任何整数转换为十六进制字符串。您的代码也可以与使用print convert_hex_to_ascii(123456)
马克·拉卡塔

5

或者,您也可以执行此操作...

Python 2解释器

print "\x70 \x61 \x75 \x6c"

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:~# 

要么

Python 2单行

python -c 'print "\x70 \x61 \x75 \x6c"'

user@linux:~# python -c 'print "\x70 \x61 \x75 \x6c"'
p a u l
user@linux:~# 

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单行

python -c 'print("\x70 \x61 \x75 \x6c")'

user@linux:~$ python -c 'print("\x70 \x61 \x75 \x6c")'
p a u l

user@linux:~$ python -c 'print("\x70\x61\x75\x6c")'
paul

2
这在没有空格的情况下也可以正常工作,并且在带有print()的python3中也可以正常工作。
rjferguson

是的,我故意放它以便于查看。让我也用Python 3更新答案。
萨布丽娜

3

在Python 3.3.2中进行了测试有多种方法可以完成此操作,这是最短的方法之一,仅使用python提供的工具即可:

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

当然,如果您不想导入任何内容,则可以随时编写自己的代码。像这样非常基本的东西:

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.