我需要验证 IP 数据包的校验和标头。到目前为止,我使用了论坛上发布的函数校验和,我猜我应该得到的结果是一个 cero(使用头和校验和)但我得到了 29574。我设法在不同的变量中解析数据包以将头与数据分开,将它们放在一个列表中,然后从标题和校验和中创建一个仅包含数据的新字符串。需要知道我做错了什么。是我正在创建的字符串还是我如何在校验和函数中使用该字符串?
这是我的代码:
#Verifying if checksum of packet is correct
str_header=''.join(str(header))
print checksum(str_header)
#Reference:http://stackoverflow.com/questions/1767910/checksum-udp-calculation-python
def carry_around_add(a, b):
c = a + b
return (c & 0xffff) + (c >> 16)
def checksum(msg):
s = 0
w = 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
列表标题包含以下信息:
Ver: 4
HL: 12
TOS: 0
LEN: 50
ID= 456
OFF: 16384
TTL: 5
PROT: 6
CHSUM: 12407
SRC: 16885952
DST: 167880896
rem_head: ['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
data: ['A', 'A']
谢谢