gpt4 book ai didi

python - 在python中计算IP校验和

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:20 25 4
gpt4 key购买 nike

我需要按照 http://www.faqs.org/rfcs/rfc1071.html 中的描述计算 IP 数据包的校验和.

我已经有以下代码:

#!/usr/bin/python
import struct

data = "45 00 00 47 73 88 40 00 40 06 a2 c4 83 9f 0e 85 83 9f 0e a1"

# a test for the checksum calculation

def _checksum(data):
#calculate the header sum
ip_header_sum = sum(struct.unpack_from("6H", data))
#add the carry
ip_header_sum = (ip_header_sum & 0xFFFF) + (ip_header_sum >> 16 & 0xFFFF)
#invert the sum, python does not support inversion (~a is -a + 1) so we have to do
#little trick: ~a is the same as 0xFFFF & ~a
ip_header_sum = ~ip_header_sum & 0xFFFF

return ip_header_sum #should return 0 if correct

data = data.split()
data = map(lambda x: int(x,16), data)
data = struct.pack("%dB" % len(data), *data)

print " ".join(map(lambda x: "0x%02x" % ord(x), data))
print "Checksum: 0x%04x" % _checksum(data)

它适用于我用 wireshark 捕获的包,它应该有正确的校验和,因此应该评估为 0

不幸的是,结果是 0x6524。同样有趣的是,对于每个正确的数据包,结果总是 0x6524...

谁发现了错误?

已编辑以使错误更清楚*第二次编辑*

最佳答案

您可以直接使用来自 checksum udp calculation python 的解决方案,这会导致预期的校验和值为零。

import struct

data = "45 00 00 47 73 88 40 00 40 06 a2 c4 83 9f 0e 85 83 9f 0e a1"

def carry_around_add(a, b):
c = a + b
return (c & 0xffff) + (c >> 16)

def checksum(msg):
s = 0
for i in range(0, len(msg), 2):
w = ord(msg[i]) + (ord(msg[i+1]) << 8)
s = carry_around_add(s, w)
return ~s & 0xffff

data = data.split()
data = map(lambda x: int(x,16), data)
data = struct.pack("%dB" % len(data), *data)

print ' '.join('%02X' % ord(x) for x in data)
print "Checksum: 0x%04x" % checksum(data)

结果:

45 00 00 47 73 88 40 00 40 06 A2 C4 83 9F 0E 85 83 9F 0E A1
Checksum: 0x0000

关于python - 在python中计算IP校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3949726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com