使用bu在Python中计算二进制文件的CRC/CRC32哈希/校验和

2024-03-28 09:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力自学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中


Tags: 文件代码read二进制校验jpgbigzlib
1条回答
网友
1楼 · 发布于 2024-03-28 09:26:38

当前只计算文件最后一个块的CRC。为了将此传递电流crcvalue固定为^{}作为起始值:

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文档中的相关部分:

If value is present, it is used as the starting value of the checksum; otherwise, a default value of 0 is used. Passing in value allows computing a running checksum over the concatenation of several inputs.

相关问题 更多 >