用于校验和的python结构解包

用于校验和的python结构解包,python,struct,checksum,unpack,Python,Struct,Checksum,Unpack,我用这行代码打包了一个结构 # type(8) code(8) checksum(16) process id(16) sequence(16) packet = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, packet_checksum, pid, sequence) 现在我正在使用一个校验和计算函数来解包,解包的方式是去掉校验和应该在哪里的16位。但我不知道它是怎么做到的,和函数到底做了什么?把不同的元素加起来 n = len(pkt) two_b

我用这行代码打包了一个结构

# type(8) code(8) checksum(16) process id(16) sequence(16)
packet = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, packet_checksum, pid, sequence)
现在我正在使用一个校验和计算函数来解包,解包的方式是去掉校验和应该在哪里的16位。但我不知道它是怎么做到的,和函数到底做了什么?把不同的元素加起来

n = len(pkt)
two_bytes = struct.unpack("%sH" % (n/2), pkt)
chksum = sum(two_bytes)

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

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

for x in xrange(0, len(packet), 2):
    print struct.unpack("H", packet[x:x+2])[0]
这假设您的数据包是偶数字节,因此如果长度是奇数,您可以临时为计算附加一个额外的0

请注意,ICMP校验和不是将这些校验和相加的简单情况,它需要一个互补和。有关更多信息,请参见下文。

您阅读了吗?我对n=lenpkt;…%的用法感到困惑sH%n/2,因为H是2字节,所以取字节长度,然后除以2,再乘以H的长度,也就是2。。。n=n/2*2,所以这部分似乎毫无意义。