在尝试与名为BSS London Blu-80的音频处理设备通信时,我发现我必须发送通过Xoring消息创建的校验和。发送的示例消息是:
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'
我在这里显然做错了,并没有完全理解这一点。任何帮助将不胜感激。
谢谢!
答案 0 :(得分:6)
您已将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(' ')]
或者,您可以考虑对其进行编码&#34;对&#34;从一开始:
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
,这意味着您计算的错误或原始消息不是您提供的消息。
答案 1 :(得分:0)
8位校验和解决方案
r = hex(0x37 ^ 0x37 ^ 0xA0 ^ 0x00 ^ 0x07 ^ 0x63 ^ 0x80 ^ 0x8A ^ 0x05 ^ 0x0C)[2:]。upper()
结果-'C7'