【问题标题】:python struct unpacking for a checksumpython struct解包校验和
【发布时间】:2015-09-03 21:47:56
【问题描述】:

我使用这一行打包了一个结构

# type(8) code(8) checksum(16) process id(16) sequence(16)
packet = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, packet_checksum, pid, sequence)

现在我使用校验和计算函数来解包数据包,从而删除校验和应该在的位置(packet_checksum)的 16 位。但我不知道它是如何做到的,sum 函数实际上是做什么的?把不同的元素加起来?:

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

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

【问题讨论】:

  • 你读过relevantdocumentation吗?
  • 我对@9​​87654325@的使用感到困惑,因为,嗯,H是2个字节,所以取字节长度,然后除以2,然后乘以H的长度,即又是 2...n = (n/2) * 2 所以这部分似乎毫无意义。

标签: python struct checksum unpack


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2019-10-25
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多