相关疑难解决方法(0)

Python CRC-32问题

我正在编写一个Python程序,用于从6 GB bz2文件的中间提取数据.bzip2文件由独立可解密的数据块组成,所以我只需要找到一个块(它们由魔术位分隔),然后在内存中创建一个临时的一块bzip2文件,最后将其传递给bz2.decompress函数.容易,不是吗?

bzip2 格式最后有一个文件的crc32校验和.没问题,binascii.crc32来救援.可是等等.要校验和的数据不一定以字节边界结束,而crc32函数在整数个字节上运行.

我的计划:在除最后一个字节之外的所有字节上使用binascii.crc32函数,然后使用我自己的函数来更新最后1-7位的计算crc.但是数小时的编码和测试让我感到困惑,我的困惑可以归结为这个问题:为什么crc32("\ x00")不是0x00000000?根据维基百科的文章,它应该不是吗?

你从0b00000000开始,用32 0填充,然后用0x04C11DB7进行多项式除法,直到前8位没有剩下的,这是立即的.你的最后32位是校验和,怎么能不是全零?

我搜索了Google的答案并查看了几个CRC-32实现的代码,却没有找到任何关于为什么会这样做的线索.

python crc32 bzip2

5
推荐指数
1
解决办法
6692
查看次数

在 Python 中使用 zlib crc32_combine

我正在尝试在 Python 中使用zlib中的crc32_combine函数。尽管可以使用各种其他 zlib 函数,但该函数不是“包含电池”标准库的一部分。我尝试了两种方法:从 C 代码到 Python 的端口和从 Python 调用 zlib 与 ctypes。两者都给了我不同的结果,尽管不是我期望的结果。我正在展示 ctypes 代码,因为我认为它执行得更快,并且出现其他程序员错误的可能性更小。

当提供第二个散列的数据长度时,该算法可以组合两个CRC32散列。crc32_combine定义如下:

crc32(crc32(0, seq1, len1), seq2, len2) == crc32_combine(
    crc32(0, seq1, len1), crc32(0, seq2, len2), len2)
Run Code Online (Sandbox Code Playgroud)

这是输出:

Expected CRC: 45E57586
Combined CRC: 567EE4E4
Run Code Online (Sandbox Code Playgroud)

在 win32 上使用 Python 3.5.1 运行时,第二行总是不同的。不是 Python 2,但结果也不是我所期望的。将zlib1.dll放在与脚本相同的目录中进行尝试。

import zlib

def crc32_combine_ctypes(crc1, crc2, len2):
    import ctypes
    from ctypes import util

    lib = util.find_library('zlib1')
    _zlib = ctypes.CDLL(lib)
    assert _zlib._name, "Can't find zlib"

    _zlib.crc32_combine.argtypes …
Run Code Online (Sandbox Code Playgroud)

python crc32 ctypes zlib

2
推荐指数
1
解决办法
1119
查看次数

标签 统计

crc32 ×2

python ×2

bzip2 ×1

ctypes ×1

zlib ×1