我有以下问题。代码如下:
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)
导致此错误的原因是什么?
答案 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。