将ASCII字符串编码数组转换为字符串?

时间:2020-03-05 11:27:57

标签: python python-3.x

输入:

'0x0 0x48 0x65 0x6c 0x6c 0x6f 0x8E 0x21'

输出:

Hello!

当前解决方案:

    s = []
    birary_data = '0x0 0x48 0x65 0x6c 0x6c 0x6f 0x8E 0x21'.replace(' ', '').split('0x')
    for c in birary_data:
        if len(c) > 1:
            s.append(bytes.fromhex(c).decode('utf-8', 'ignore'))
    print("".join(s))

需要帮助:

请问有人可以提出更优雅的解决方案吗?

5 个答案:

答案 0 :(得分:3)

尝试一下:

data = '0x0 0x48 0x65 0x6c 0x6c 0x6f 0x8E 0x21'
string = "".join([chr(int(item, 16)) for item in data.split()])
print(string)

输出:

Hello!

答案 1 :(得分:2)

您可以使用以下一种 在代码中,我首先根据空格将十六进制拆分,然后迭代并加入我得到的字符。

a = '0x0 0x48 0x65 0x6c 0x6c 0x6f 0x8E 0x21'
print(''.join(chr(int(i, 16)) for i in a.split()))

答案 2 :(得分:2)

另一个选择是删除3个字符(或更少)长度的子字符串0x和空格。 bytes.fromhex可以处理类似'48656c6c6f8E21'

的字符串
binary_data = '0X0 0x48 0x65 0x6c 0x6c 0x6f 0x8E 0x21'
binary_data = re.sub(r'\b\w{3}\b|\s?0x', '', binary_data)
print(bytes.fromhex(binary_data).decode('utf-8', 'ignore'))

答案 3 :(得分:1)

内置bytes.fromhex()几乎是我们所需要的。但是,我们需要解决两个问题:

  • 开头的空字节
  • 位置6(0x8E)中的无效字符
import re

data = '0x0 0x48 0x65 0x6c 0x6c 0x6f 0x8E 0x21'

string = bytes.fromhex(re.sub('0x(0 )?', '', data)).decode('utf-8', 'ignore')

正则表达式将负责剥离空字节和正确格式化bytes.fromhex()的字符串。解码中的ignore将跳过坏字节。

答案 4 :(得分:0)

birary_data = '0x0 0x48 0x65 0x6c 0x6c 0x6f 0x8E 0x21'.replace('0x', '').split()
print(bytearray.fromhex(''.join(c for c in birary_data if len(c) > 1)).decode('utf-8', 'ignore'))

输出:

Hello!