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

q7solyqu  于 2023-11-20  发布在  Python
关注(0)|答案(4)|浏览(131)

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

comments.decode("hex")

字符串
其中,变量“comments”是文件中一行的一部分(该行的其余部分 * 不 * 需要转换,因为它只以ASCII表示。
然而,在Python 3中,这不起作用(我假设是因为bytes/string与string/unicode开关。我觉得Python 3中应该有一个一行程序来做同样的事情,而不是阅读整行作为一系列字节(我不想这样做),然后分别转换该行的每一部分。如果可能的话,我想把整行读成一个unicode字符串(因为该行的其余部分都是unicode的),只把这一部分从十六进制表示转换过来。

5cg8jx4n

5cg8jx4n1#

比如说:

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

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

swvgeqrz

swvgeqrz2#

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]

字符串

f87krz0w

f87krz0w3#

来自@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字节。

4sup72z8

4sup72z84#

我想解码一个字节的字符串,它可能会在结尾遗漏一个字符。
因为十六进制的字节数是2,所以codecs不能工作。所以我不得不写一个小函数。

def decode_hexstring(hexstring):
    decoded = ''

    for i in range(0, len(hexstring), 2):
        b = hexstring[i:i+2]
        b = b.decode() # it's a byte-string

        try:
            c = bytes.fromhex(b).decode()
        except: # the last char might be missing
            c = '☐'

        decoded = decoded + c

    return decoded

print(decode_hexstring(b'737030306b792d686578737472696e676'))

个字符

相关问题