使用缓冲区在Python中计算二进制文件上的CRC/CRC32散列/校验和

Dav*_*ker 4 python binary hash crc32 checksum

我一直在努力教自己Python,所以我不完全理解我在做什么.我很尴尬地说这个,但我的问题应该很容易回答.我希望能够对二进制文件执行CRC校验和,代码类似于:

# http://upload.wikimedia.org/wikipedia/commons/7/72/Pleiades_Spitzer_big.jpg

import zlib

buffersize = 65536

with open('Pleiades_Spitzer_big.jpg', 'rb') as afile:
    buffr = afile.read(buffersize)
    while len(buffr) > 0:
        crcvalue = zlib.crc32(buffr)
        buffr = afile.read(buffersize)

print(format(crcvalue & 0xFFFFFFFF, '08x'))
Run Code Online (Sandbox Code Playgroud)

正确的结果应该是"a509ae4b"但我的代码的结果是"dedf5161".我认为正在发生的是校验和是在文件的第一个或最后一个64kb而不是整个文件上计算的.

如何更改代码以便检查整个文件而不将整个文件加载到内存中?

实际上,代码在Python 2.x或3.x中"起作用".如果代码已经是在一个或另一个,我宁愿它是在3.x的

nie*_*mmi 7

您当前正在计算文件的最后一个块的CRC.为了解决这个问题通电流crcvaluecrc32作为初始值:

import zlib

buffersize = 65536

with open('Pleiades_Spitzer_big.jpg', 'rb') as afile:
    buffr = afile.read(buffersize)
    crcvalue = 0
    while len(buffr) > 0:
        crcvalue = zlib.crc32(buffr, crcvalue)
        buffr = afile.read(buffersize)

print(format(crcvalue & 0xFFFFFFFF, '08x')) # a509ae4b
Run Code Online (Sandbox Code Playgroud)

以下是Python文档的相关部分:

如果存在值,则将其用作校验和的起始值; 否则,使用默认值0.传入值允许在多个输入的串联上计算运行的校验和.