Проблемы с Python CRC-32

Я пишу программу Python для извлечения данных из середины файла bz2 размером 6 ГБ . Файл bzip2 состоит из независимо расшифровываемых блоков данных, поэтому мне нужно только найти блок (они разделены магическими битами), затем создать из него временный одноблочный файл bzip2 в памяти и, наконец, передать его в функция bz2.decompress. Легко, нет?

Формат bzip2 имеет контрольную сумму crc32 для файла в конце. Нет проблем, binascii.crc32 на помощь. Но подождите. Данные должны быть контрольная сумма не обязательно заканчивается на границе байта, и функция crc32 работает с целым числом байтов.

Мой план: использовать функцию binascii.crc32 для всех, кроме последнего байта, а затем мою собственную функцию для обновления вычисленный crc с последними 1-7 битами. Но часы написания кода и тестирования оставили меня в недоумении, и мое недоумение можно свести к этому qu estion: Почему crc32 ("\ x00") не равен 0x00000000? Разве это не должно быть, согласно статье в Википедии?

Вы начинаете с 0b00000000 и дополняете 32 нулями, затем выполняете полиномиальное деление с помощью 0x04C11DB7 до тех пор, пока в первых 8 битах не останется единиц, что происходит немедленно.Ваши последние 32 бита - это контрольная сумма, и как это может быть не все нули?

Я поискал в Google ответы и посмотрел на код нескольких реализаций CRC-32, но не нашел никакого объяснения, почему это так.

5
задан Nayuki 4 June 2015 в 04:19
поделиться