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

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

comments.decode("hex")

其中,变量‘ comments’是文件中一行的一部分(该行的其余部分需要转换,因为它只在 ASCII 中表示。

但是,现在在 Python 3中,这种方法不起作用(我假设这是因为使用了字节/字符串与字符串/unicode 开关。我觉得 Python 3中应该有一行程序来做同样的事情,而不是将整行读取为一系列字节(我不想这么做) ,然后分别转换每一行的每一部分。如果可能的话,我希望将整行读取为 unicode 字符串(因为该行的其余部分是 unicode 字符串) ,并且只将这一部分从十六进制表示转换为 Unicode 字符串。

197702 次浏览

比如:

>>> bytes.fromhex('4a4b4c').decode('utf-8')
'JKL'

只需要输入您正在使用的实际编码即可。

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]

来自@unbeli 和@Niklas 的答案很好,但是@unbeli 的答案并不适用于所有的十六进制字符串,因此在不导入额外库(codecs)的情况下进行解码是可取的。下面的代码应该可以工作(但是对于大字符串来说效率不是很高) :

>>> result = bytes.fromhex((lambda s: ("%s%s00" * (len(s)//2)) % tuple(s))('4a82fdfeff00')).decode('utf-16-le')
>>> result == '\x4a\x82\xfd\xfe\xff\x00'
True

基本上,它通过使用零填充和解码为 utf-16来处理无效的 utf-8字节。