因此,我正在从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
我没有意识到最后一个字节实际上是校验和。