Я пишу программу на Python для извлечения данных из середины файла размером 6 ГБ bz2.Файл bzip2 состоит из независимо дешифруемых блоков данных, поэтому мне нужно только найти блок (они разделены магическими битами), затем создать временный одноблочный файл bzip2 из него в памяти и, наконец, передать егоФункция bz2.decompress.Легко, нет?
Формат bzip2 имеет контрольную сумму crc32 для файла в конце.Нет проблем, binascii.crc32 на помощь.Но ждать.Данные для контрольной суммы не обязательно заканчиваются границей байтов, а функция crc32 работает с целым числом байтов.
Мой план: используйте функцию binascii.crc32 для всех, кроме последнего байта, а затеммоя собственная функция для обновления вычисленного crc с последними 1–7 битами.Но часы кодирования и тестирования оставили меня в замешательстве, и моя загадка может быть сведена к следующему вопросу: почему crc32 ("\ x00") не равен 0x00000000?Разве это не должно быть, согласно статье в Википедии?
Вы начинаете с 0b00000000 и добавляете 32 0, затем выполняете полиномиальное деление с 0x04C11DB7 до тех пор, пока в первых 8 битах не останется ни одного, что сразу.Ваши последние 32 бита являются контрольной суммой, и как это может быть не всеми нулями?
Я искал в Google ответы и посмотрел код нескольких реализаций CRC-32, не найдя никакой подсказки, почему это так.