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

6 投票
2 回答
22946 浏览
提问于 2025-04-29 03:32

在尝试与一个叫做BSS London Blu-80的音频处理设备通信时,我发现我需要发送一个通过异或运算(XOR)生成的校验和。比如,我要发送的消息是:

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

其中0xc2就是这个消息的正确校验和。

“校验和是消息主体中所有字节进行异或运算后得到的一个字节。”

消息主体就是上面提到的内容,去掉校验和后的部分。

不过,我尝试的代码是:

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'

任何帮助都将不胜感激。

暂无标签

2 个回答

0

8位校验和的解决方案

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

结果是-'C7'

9

你把 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'

在这个时候,我们可以逐个进行异或运算:

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

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

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

撰写回答