6 GB の bz2 ファイルの途中からデータを抽出する Python プログラムを作成しています。bzip2 ファイルは、個別に復号化可能なデータ ブロックで構成されているため、必要なのはブロック (マジック ビットで区切られている) を見つけて、そこから一時的な 1 ブロックの bzip2 ファイルをメモリに作成し、最後にそれをbz2.decompress 関数。簡単ですよね?
bzip2形式には、最後にファイルの crc32 チェックサムがあります。問題ありません。binascii.crc32 が役に立ちます。ちょっと待って。チェックサムを計算するデータは必ずしもバイト境界で終わるとは限らず、crc32 関数は整数バイトで動作します。
私の計画: binascii.crc32 関数を最後のバイト以外のすべてに使用し、独自の関数を使用して、計算された crc を最後の 1 ~ 7 ビットで更新します。しかし、何時間にもわたるコーディングとテストの結果、私は戸惑いました。私の困惑は、次の質問に要約できます。ウィキペディアの記事によると、そうすべきではありませんか?
0b00000000 で開始し、32 個の 0 でパディングしてから、最初の 8 ビットに 1 が残らなくなるまで、0x04C11DB7 で多項式除算を行います。最後の 32 ビットはチェックサムです。なぜそれがすべてゼロにならないのでしょうか?
私は答えを求めて Google を検索し、いくつかの CRC-32 実装のコードを調べましたが、その理由についての手がかりは見つかりませんでした。