在Python 3中解码十六进制字符串

chi*_*der 47 python python-3.x

在Python 2中,将字符串的十六进制形式转换为相应的unicode非常简单:

comments.decode("hex")
Run Code Online (Sandbox Code Playgroud)

其中,变量"评论"是在文件中的线的一部分(该行的其余部分也需要转换,因为它仅在ASCII表示.

然而,现在在Python 3中,这不起作用(我假设因为字节/字符串与字符串/ unicode开关.我觉得Python 3中应该有一个单行程来做同样的事情,而不是阅读整行作为一系列字节(我不想这样做),然后分别转换行的每一部分.如果可能的话,我想把整行读作unicode字符串(因为剩下的该行是unicode)并且只从十六进制表示转换这一部分.

unb*_*eli 74

就像是:

>>> bytes.fromhex('4a4b4c').decode('utf-8')
'JKL'
Run Code Online (Sandbox Code Playgroud)

只需输入您正在使用的实际编码.

  • 如果是格式为\ x6b\x61\x6d\x69会怎么样? (8认同)
  • 除非解码后的字符串*实际上是*utf-8,否则我建议使用`decode('ascii')`. (3认同)
  • 但并不适用于所有十六进制字符串。例如,“bytes.fromhex('82').decode('utf-8')”会引发“UnicodeDecodeError”。使用“ascii”格式并不能解决问题,因为对于值 >127 的字节将失败。 (2认同)

Nik*_*las 13

import codecs

decode_hex = codecs.getdecoder("hex_codec")

# for an array
msgs = [decode_hex(msg)[0] for msg in msgs]

# for a string
string = decode_hex(string)[0]
Run Code Online (Sandbox Code Playgroud)

  • 这种方法是通用的,适用于 py2 和 py3。谢谢! (3认同)