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

时间:2010-07-19 18:44:41

标签: python python-3.x

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

comments.decode("hex")

其中变量'comments'是文件中一行的一部分(该行的其余部分 not 需要转换,因为它仅以ASCII表示。

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

4 个答案:

答案 0 :(得分:62)

类似的东西:

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

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

答案 1 :(得分:9)

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]

答案 2 :(得分:0)

@unbeli和@Niklas的答案很好,但是@unbeli的答案不适用于所有十六进制字符串,因此希望在不导入额外库(编解码器)的情况下进行解码。以下应该可以工作(但对于大字符串而言效率不高):

>>> 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字节的问题。

答案 3 :(得分:0)

这是另一个更简单的恕我直言。

JObject

示例:

''.join[[chr("0x" + hex) for hex in sequence])