DeprecationWarning:不建议使用struct integer overflow masking

时间:2012-09-09 14:10:03

标签: python struct

我有以下问题。代码如下:

import  binascii, struct
def crc32up(data):
    # little endian!!
    bin = struct.pack ('<I', binascii.crc32 (data))
    return string.upper (binascii.hexlify (bin))

# Generate crc of time code.
#
timecrc_code = crc32up(time_code)

并且警告是:

 DeprecationWarning: struct integer overflow masking is deprecated
 timecrc_code = crc32up(time_code)

导致此错误的原因是什么?

1 个答案:

答案 0 :(得分:6)

您尝试打包到为其分配的4个字节中的值太大:

>>> import struct
>>> n = 2 ** 32
>>> n
4294967296L
>>> struct.pack('<I', n - 1)
'\xff\xff\xff\xff'
>>> struct.pack('<I', n)
__main__:1: DeprecationWarning: struct integer overflow masking is deprecated
'\x00\x00\x00\x00'

较新的python版本(&gt; = 2.6)也会向您发出有关接受 的值的警告:

>>> import struct
>>> struct.pack('<I', -1)
__main__:1: DeprecationWarning: struct integer overflow masking is deprecated
__main__:1: DeprecationWarning: 'I' format requires 0 <= number <= 4294967295
'\xff\xff\xff\xff'

python告诉你的是它必须屏蔽该值以适应4个字节;您可以使用value & 0xFFFFFFFF自行完成此操作。

警告在python程序执行期间只发出一次。

请注意,从2.6开始,binascii.crc32值始终是 signed 4字节值,您应始终使用掩码来打包这些值。这在2.6之前并不总是一致的,并且取决于平台。有关详细信息,请参阅the documentation