这是如何计算互联网校验和

2024-04-24 12:53:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我花了几个小时想弄明白:

data = b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF'
v = sum(struct.unpack('!%sH' % int(len(data)/2), data))
for i in range(3):
    chksum += v & 0xffff
    v = v >> 16

我知道它在做什么,直到我进入射程。让我感动的是:

^{pr2}$

我确定v是8字节,我知道它基本上是清除位。但它只有一半大小,那么它是大的还是小的?在

我不知道。任何帮助都将不胜感激


Tags: infordatalenshrangestructint
2条回答

字符串的计算结果为'!4H',它恰好是一组4个无符号短值。在

注意,没有和的v(struct.unpack('!%sH' % int(len(data)/2), data)) 这是(65535,65535,65535,65535)。在

请注意,0xffff是65535。在

不幸的是,在Python中,它被转换成一个int32对象,在sum之后,结果是值:262140。在Python中,v.nbytes是4,v.dtype是dtype('int32')。在

最后,>> 16右移16而不是16个字节,如'%x'%(0xffff >> 1) = '7fff'

Python数字的位宽度未指定-它们是arbitrary size。在

“按位与”运算符的工作原理与广告中所说的一样,所以让我们一步一步来:

  1. v & 0xffff-屏蔽v的最低有效16位(因为2^16-1=0xffff)正在将v截断为mod 2^16
  2. 将截断的数量加到chksum
  3. 通过在自身上折叠和来处理任何剩余的进位(互联网校验和是根据16位整数计算的)

你的代码在处理(3)方面是不完整的,但想法是一样的。有关详细信息,请参阅RFC。在

相关问题 更多 >