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

Nic*_*las 5 python xor

在尝试与名为BSS London Blu-80的音频处理设备通信时,我发现我必须发送由Xoring消息创建的校验和.发送的示例消息将是:

0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00 0xc2
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

我显然在这里做错了什么,并没有完全理解这一点.任何帮助将不胜感激.

谢谢!

Ste*_*ppo 7

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

packet = '0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x4b 0x00 0x00'
Run Code Online (Sandbox Code Playgroud)

所以你当前的消息不是[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(' ')]
Run Code Online (Sandbox Code Playgroud)

或者,您可以考虑从一开始就"正确"编码:

packet = '\x8d\x1e\x19\x1b\x83\x00\x01\x01\x00\x00\x00\x4b\x00\x00'
Run Code Online (Sandbox Code Playgroud)

在这一点上,我们可以xor,成员:

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

print checksum, hex(checksum), chr(checksum)
Run Code Online (Sandbox Code Playgroud)

我得到的校验和0x59不是0xc2,这意味着您计算了错误的校验和,或者原始消息不是您提供的消息.