在 python 3 中使用 xor 计算校验和

Calculate the checksum using xor in python 3

所以,我正在从一个 ip 设备收集一些代码,我正在努力计算它的校验和。 例如,这是我在 python:

中使用简单套接字收集的包
b'\x07\x94ES(\xff\xceY:'

使用 .hex() 将其转换为更易于阅读的内容,我得到了这个:

0794455328ffce593a

3a 是给定的校验和,我应该能够通过异或代码(如 07^94^45^53^28^ff^ce^59^FF = 3a)获得相同的值,但我无法弄清楚如何。我试图将这些值作为整数进行异或运算,但结果相差甚远。 顺便说一句,07是包的字节数。

另一个字符串示例是

b'\x11\xb0\x11\x05\x03\x02\x08\x01\x08\x01\x03\x08\x03\n\x01\n\n\x01I'

有人有想法吗?

通过一些猜测和 2 个示例,似乎所使用的异或算法正在翻转某处的所有位。进行翻转会使示例的值匹配。

data_list = [b'\x07\x94ES(\xff\xceY:', b'\x11\xb0\x11\x05\x03\x02\x08\x01\x08\x01\x03\x08\x03\n\x01\n\n\x01I']
for data in data_list:
    value = data[0]
    for d in data[1:-1]:
        value ^= d

    checksum = value ^ 0xFF  # negate all the bits

    if checksum == data[-1]:
        print("checksum match for {}".format(data))
    else:
        print("checksum DOES NOT MATCH for {}".format(data))

打印:

checksum match for b'\x07\x94ES(\xff\xceY:'
checksum match for b'\x11\xb0\x11\x05\x03\x02\x08\x01\x08\x01\x03\x08\x03\n\x01\n\n\x01I'

不确定它是否对未来的读者有帮助,但至少这个问题已经解决了。

如果你很好奇,这里是你在评论中输入的 C# 实现的直接端口:

def calculate(data):
    xor = 0
    for byte in data:
        xor ^= byte

    xor ^= 0xff
    return xor

我没有意识到最后一个字节实际上是校验和。