CRC32 和 zip文件的crc 字段

本文介绍了CRC32在Python中的计算,探讨了0x04c11db7和0xedb88320的关系及其在高位和低位计算中的应用。同时,解析了ZIP文件中的CRC校验字段,指出其为压缩前文件内容的CRC,并通过实例展示了如何验证CRC值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值