1

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

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)

是什么导致了这个错误?

4

1 回答 1

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 版本 (>= 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值始终是带符号的4 字节值,您应该始终使用掩码来打包这些值。这在 2.6 之前并不总是一致的,并且取决于平台。有关详细信息,请参阅文档

于 2012-09-09T14:23:30.690 回答