【问题标题】:Creating xor checksum of all bytes in hex string In Python在Python中创建十六进制字符串中所有字节的异或校验和
【发布时间】:2019-06-18 14:57:42
【问题描述】:

在尝试与名为 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'

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

谢谢!

【问题讨论】:

  • 试试packet = '\x8d\x1e\x19\x1b\x83\x00\x01\x01\x00\x00\x00\x4b\x00\x00'
  • 您可以在此处查看您的结果:th-thielemann.de/tools/checksum.html

标签: python xor


【解决方案1】:

您已将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,这意味着要么您计算错误,要么原始消息不是您提供的。

【讨论】:

  • 这只会增加混乱。该带有校验和的消息是由用于测试 blu-10 中不同对象的命令的工具生成的。当我复制该消息并直接使用 Python 发送它时,对象的状态会发生变化。所以校验和对于那个字符串是正确的。
  • 您所指的文档说 " 是 中所有字节的异或,替换前。"。我不知道这里 "substitution" 是什么意思,但我想问题在于被替换的内容。
  • 你完全正确。我一直在想我没有替代。但是,我从没想过 DI 工具生成的字符串向我显示了一个带有替换的字符串。在删除 '\x1b\x83' 并将其替换为它的替代项 (\x03),然后生成校验和后,我能够返回 c2。感谢您引起我的注意!
  • 您能解释一下“替代”是什么意思吗?我也有类似的情况,但我找不到任何解释这意味着什么。
【解决方案2】:

8位校验和解决方案

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

结果-'C7'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多