我一直在努力教自己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中。
答案 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。传入值允许在多个输入的串联上计算运行的校验和。