python中的计算
注意,python 的计算结果是有符号的,如果要转为unsigned 可以和0xffffffff与操作
>>> import zlib
>>> import binascii
s = b'hello,word!'
>>> zlib.crc32(s)
3035098857
>>> binascii.crc32(s)
3035098857
>>> zlib.crc32(b"hello") & 0xffffffff
907060870
0x04c11db7 和 0xedb88320
Python中用的是后面的
这两个数字其实是相互的二进制形式的反转,具体参考链接2
所以两个数字相对应的table 也是各自的反转(不只是table中每个位置对应的数字要反转,下标也要反转)
相应的两个table 的 实质的计算顺序分辨是,先高位,和先低位
比如要校验的串是\x01\x02
先高位,用0x04c11db7
第一步是把bit0
和初始串(0xffffffff)的高位抑或,也就是
1111 1111 1111 1111 1111 1111 1111 1111
然后因为第一位是1,补0后的后面的16位 和 0x04c11db7 抑或操作
按照上面的步骤16次预算的结果,相当于在0x04c11db7下 计算下面这个串的校验码
1110 1101 1111 1111 1111 1111 1111 1111 0000 0000
从左向右算,计算过程要左移
先低位,用0xedb88320
相当于用0xedb88320计算串
0000 0000 1111 1111 1111 1111 1111 1111 1101 1110
从右向左算,计算过程要右移
下面是生成crc table 和测试的代码:
from zlib import crc32
def mycrc(input):
x=inverse32(0x04c11db7)
init=0xffffffff
t=init
for i in input:
t=t^o