python struct解压缩校验和

时间:2015-09-03 11:50:52

标签: python struct checksum unpack

我使用这行

打包了一个结构
n = len(pkt)
two_bytes = struct.unpack("%sH" % (n/2), pkt)
chksum = sum(two_bytes)

现在我正在使用校验和计算功能,该功能以一种方式解包数据包,即校验和所在的16位(packet_checksum)被删除。但我不知道它是如何做到的,总和功能实际上做了什么?加起来不同的元素?:

{{1}}

代码运作良好我只是想知道它是如何工作的。

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试创建ICMP数据包,然后为其计算校验和。为此,您应该使用pack执行校验和的初始0,而不是尝试将其删除。然后,您可以按如下方式提取每个WORD:

for x in xrange(0, len(packet), 2):
    print struct.unpack("H", packet[x:x+2])[0]

这假设您的数据包是偶数个字节,因此如果长度为奇数,您可能会暂时为计算添加额外的0。

注意,ICMP校验和不是将这些添加在一起的简单情况,它需要一个补码和。有关详细信息,请参阅以下answer