2016-12-13 4 views
1

Я пытался научить себя Python, поэтому я не совсем понимаю, что я делаю. Я смущен, чтобы сказать это, но на мой вопрос должно быть очень легко ответить. Я хочу быть в состоянии сделать CRC контрольных сумм двоичных файлов с кодом, аналогичным образом:Вычислить хэш/контрольную сумму CRC/CRC32 в двоичном файле в Python с использованием буфера

# 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». Я думаю, что происходит то, что контрольная сумма вычисляется либо в первом, либо в последнем 64 КБ файла вместо всего файла.

Как код должен быть изменен, чтобы он проверял весь файл без загрузки всего файла в память?

Как бы то ни было, код «работает» в Python 2.x или 3.x. Если у кода есть, чтобы быть в этом или нет, я бы предпочел, чтобы он был в 3.x.

ответ

5

В настоящее время вы вычисляете 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. Передача значения позволяет вычислять текущую контрольную сумму по конкатенации нескольких входов.

+0

Я прочитал это в документах Python, но не понял его достаточно хорошо, чтобы заставить код работать. Спасибо, много! –