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

在Python中创建十六进制字符串中所有字节的xor校验和,python,xor,Python,Xor,在尝试与名为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

在尝试与名为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'
数据包='0x8d 0x1e 0x19 0x1b 0x83 0x00 0x01 0x01 0x00 0x00 0x00 0x00 0x4b 0x00 0x00'
xor=0
i=0
而我>打印异或
46
>>打印十六进制(xor)
“0x2e”
很明显,我在这里做错了什么,并且没有完全理解这一点。任何帮助都将不胜感激


谢谢

您已将
数据包
声明为消息的可打印表示形式

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'

试试
packet='\x8d\x1e\x19\x1b\x83\x00\x01\x01\x00\x00\x4b\x00\x00'
。您可以在这里查看您的结果:th-thielemann.de/tools/checksum.htmlWell,这只会增加混乱。带有校验和的消息是由用于测试blu-10中不同对象的命令的工具生成的。当我复制该消息并直接用Python发送它时,对象的状态会发生变化。因此,校验和对于该字符串是正确的。您所指的文档中说“在替换之前,是中所有字节的异或。”。我不知道这里的“替换”是什么意思,但我想问题在于被替换的是什么。你完全正确。一直以来我都在想我不是在替代。但是,我从来没有想到从DI工具生成的字符串向我显示了一个带替换的字符串。。在删除“\x1b\x83”并将其替换为它所替代的内容(\x03),然后生成校验和之后,我能够返回c2。谢谢你引起我的注意!你能解释一下“替换”是什么意思吗?我也有类似的情况,但我找不到任何解释这意味着什么。