在Python中将十六进制字符串分块

3 投票
3 回答
13400 浏览
提问于 2025-04-17 18:41

我有一段Python代码:

for line in response.body.split("\n"):
    if line != "": 
        opg = int(line.split(" ")[2])
        opc = int(line.split(" ")[3])
        value = line.split(" ")[5]
        if command == 'IDENTIFY':
            if opg==opcodegroupr and opc==opcoder:
                print line
                ret['success'] = "IDENTIFY: The value is %s " % (value)
                self.write(tornado.escape.json_encode(ret))
                self.finish()

变量'line'是这样生成的:

1363005087 2459546910990453036 151 88 4 0x15000000

每个字段都是整数,但最后一个字段不是。最后一个字段是一个十六进制数字。

我想把这个十六进制数字拆分成一个个字节。比如,我希望把0x15000000拆分成15 00 00 00。

我该怎么做呢?我试过用value.encode("hex"),但效果不好……value是一个字符串吗?我不知道该怎么处理这个变量……

3 个回答

0
value = line.split(" ")[5]

value 是一个字符串,因为你没有进行转换。你可以通过 int(value, 16) 把一个十六进制的字符串转换成整数,比如:

>>> int('0x15000000', 16)
352321536
3

试试这个:

def split_hex(value):
    value = value[2:] if len(value) % 2 == 0 else "0" + value[2:]
    return " ".join(value[i:i+2] for i in range(0, len(value), 2))

注意,如果这个十六进制数字的位数是奇数,我们需要在前面加一个零,这样才能正确地把它分成字节。

print split_hex("0x1234567")
>>> 01 23 45 67
5

如果十六进制的值已经是文本格式,那就不需要再进行任何转换了:

>>> text = "0x15000000"
>>> text = text[2:]  # remove literal type prefix
>>> text = text.zfill(len(text) + len(text) % 2)  # pad with zeros for even digits
>>> ' '.join(text[i: i+2] for i in range(0, len(text), 2))  # split into 2-digit chunks
'15 00 00 00'

(根据 @tobias-k 的建议进行了编辑,关于零填充的部分)

撰写回答