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



因此,我正在从ip设备收集一些代码,并且我正在努力计算它的校验和。例如,这是我使用python中的一个简单套接字收集的包:

b'x07x94ES(xffxceY:'

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

0794455328ffce593a

3a是给定的校验和,我应该能够通过xor代码(如07^94^45^53^28^ff^ce^59^FF = 3a(获得相同的值,但我不知道如何获得。我试图将这些值异或为整数,但结果很不理想。BTW,07是包的字节数。

另一个字符串示例是

b'x11xb0x11x05x03x02x08x01x08x01x03x08x03nx01nnx01I'

有人有主意吗?

通过一点猜测和两个例子,所使用的xor算法似乎在某处翻转了所有的位。这样做会使示例的值匹配。

data_list = [b'x07x94ES(xffxceY:', b'x11xb0x11x05x03x02x08x01x08x01x03x08x03nx01nnx01I']
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'x07x94ES(xffxceY:'
checksum match for b'x11xb0x11x05x03x02x08x01x08x01x03x08x03nx01nnx01I'

不确定它是否有助于未来的读者,但至少这个问题得到了解决。

如果您很好奇,这里有一个您在注释中放入的C#实现的直接端口:

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

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

最新更新