Python: 将HEX字符串转换为字节

1 投票
1 回答
14568 浏览
提问于 2025-04-18 15:33

我正在尝试制作一个字节帧,准备通过UDP发送。我的类叫Frame,里面有一些属性,比如syncframeSizedatachecksum等等。我用十六进制字符串来表示这些值。就像这样:

testFrame = Frame("AA01","0034","44853600","D43F")

现在,我需要把这些十六进制值连接在一起,并转换成字节数组,像这样?!

def convertToBits(self):
    stringMessage = self.sync + self.frameSize + self.data + self.chk
    return b16decode(self.stringMessage)

但是,当我打印转换后的值时,得到的结果和我预期的不一样,或者我不知道怎么正确理解Python的表示法:

This is sync: AA01
This is frame size: 0034
This is data:44853600
This is checksum: D43F

b'\xaa\x01\x004D\x856\x00\xd4?'

第一个字转换得还不错(AA01 -> \xaa\x01),但是(0034 -> \x004D)就不一样了。我试着使用bytearray.fromhex,因为我可以在字节之间加空格,但结果还是一样。你能帮我通过UDP发送相同的十六进制字吗?

1 个回答

5

在Python中,任何可以表示为可打印的ASCII字符的字节都会显示为那个字符。比如说,4\x34是一样的,但Python选择以ASCII字符的形式来显示它。

所以,\x004实际上和\x00\x34是一样的,D\x856\x00\x44\x85\x36\x00也是一样的,\xd4?\xd4\x3f也是一样的,原因是:

>>> b'\x34'
'4'
>>> b'\x44'
'D'
>>> b'\x36'
'6'
>>> b'\x3f'
'?'

这只是字节值的表示方式; 这个值是完全正确的,你不需要做其他的事情。

如果你觉得有帮助,可以使用binascii.hexlify()再次将bytes值以十六进制的形式可视化:

>>> import binascii
>>> binascii.hexlify(b'\xaa\x01\x004D\x856\x00\xd4?')
b'aa01003444853600d43f'

你会看到4D6?再次被正确的十六进制字符表示。

撰写回答