これは bzip2アーカイブ形式に関する質問です。Bzip2 アーカイブは、ファイル ヘッダー、1 つ以上のブロック、およびテール構造で構成されます。すべてのブロックは、Pi 番号 0x314159265359 の 6 バイトの BCD エンコード数字である「1AY&SY」で始まる必要があります。bzip2 のソースによると:
/*--
A 6-byte block header, the value chosen arbitrarily
as 0x314159265359 :-). A 32 bit value does not really
give a strong enough guarantee that the value will not
appear by chance in the compressed datastream. Worst-case
probability of this event, for a 900k block, is about
2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits.
For a compressed file of size 100Gb -- about 100000 blocks --
only a 48-bit marker will do. NB: normal compression/
decompression do *not* rely on these statistical properties.
They are only important when trying to recover blocks from
damaged files.
--*/
問題は、すべての bzip2 アーカイブに、開始位置がバイト境界に揃えられたブロックがあるというのは本当ですか? つまり、bzip2-1.0.5+ ユーティリティである bzip2 の参照実装によって作成されたすべてのアーカイブです。
bzip2 は、ストリームをバイト ストリームではなくビット ストリームとして解析する可能性があると思います (ブロック自体はハフマンによってエンコードされており、設計上バイト アラインされていません)。
言い換えればgrep -c 1AY&SY
、ファイル内の bzip2 ブロックの数より大きい場合 (huffman はブロック内で 1AY&SY を生成する可能性がある) または等しい場合は?