我花了几个小时想弄明白:
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:
字符串的计算结果为
'!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。在
“按位与”运算符的工作原理与广告中所说的一样,所以让我们一步一步来:
v & 0xffff
-屏蔽v
的最低有效16位(因为2^16-1=0xffff)正在将v
截断为mod 2^16chksum
你的代码在处理(3)方面是不完整的,但想法是一样的。有关详细信息,请参阅RFC。在
相关问题 更多 >
编程相关推荐