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

时间:2016-12-13 04:34:02

标签: python hash binary checksum crc32

我一直在努力教自己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'))

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

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

实际上,代码在Python 2.x或3.x中“起作用”。如果代码 在一个或另一个中,我希望它在3.x中。

1 个答案:

答案 0 :(得分:6)

您目前只计算文件最后一个块的CRC。要将此传递当前crcvalue修改为crc32作为起始值:

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

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

  

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