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