输入:
'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))
需要帮助:
请问有人可以提出更优雅的解决方案吗?
答案 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()
几乎是我们所需要的。但是,我们需要解决两个问题:
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!