在Python中用十六进制字符串创建所有字节的异或校验和

2024-03-28 22:10:17 发布

您现在位置:Python中文网/ 问答频道 /正文

在尝试与一个名为BSS London Blu-80的音频处理设备通信时,我发现必须发送一个通过对消息执行异或操作而创建的校验和。发送的消息示例如下:

0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00 0xc2

0xc2是该消息的正确校验和。

“校验和是消息正文中所有字节的单字节异或(xor)。”

消息体是上面的那个减去校验和。

但是,我尝试的代码:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00'
xor = 0
i = 0
while i < len(packet):
    xor = xor ^ ord(packet[i])
    i += 1

>>print xor
46
>>print hex(xor)
'0x2e'

很明显我在这里做错了什么,而且没有完全理解这一点。任何帮助都将不胜感激。

谢谢!


Tags: 代码消息示例字节packet音频校验print
2条回答

您已将packet声明为消息的可打印表示:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00'

所以您当前的消息不是[0x8d, 0x1e, ..., 0x00],而是['0', 'x', '8', 'd', ..., '0']。所以,第一步是修复它:

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00'
packet = [chr(int(x, 16)) for x in packet.split(' ')]

或者,您可以考虑从一开始就对其进行“正确”编码:

packet = '\x8d\x1e\x19\x1b\x83\x00\x01\x01\x00\x00\x00\x4b\x00\x00'

此时,我们可以逐个成员执行xor:

checksum = 0
for el in packet:
    checksum ^= ord(el)

print checksum, hex(checksum), chr(checksum)

我得到的校验和是0x59,而不是0xc2,这意味着要么您计算错了,要么原始消息不是您提供的消息。

8位校验和解决方案

r=hex(0x37^0x37^0xA0^0x00^0x07^0x63^0x80^0x8A^0x05^0x0C)[2:].upper()

结果-“C7”

相关问题 更多 >