1

これは DEFLATE アルゴリズムに固有の質問ですが、gzip と zlib に関連しています。

ファイル内にいくつかのフラッシュ ポイントがあることがわかっている gzip ファイルがあるとします。そのうちのいくつかは Z_SYNC_FLUSH で作成され、その他は Z_FULL_FLUSH で作成されます。ファイルをスキャンすると、0000ffff のパターンにすぐに従うため、すべてのフラッシュ ポイントを見つけることができます。

解凍に必要なすべての情報が利用可能であるため、Z_FULL_FLUSH ポイントで解凍を再開できることがわかっています (IE: 辞書がリセットされます)。ただし、Z_SYNC_FLUSH から解凍しようとすると、通常、「zlib.error: 解凍中にエラー -3: 無効な距離が遠すぎます」というエラーが発生します。

問題はこれです: Z_SYNC_FLUSH ポイントから解凍しようとすると、次のいずれかが保証されますか?

  1. そのブロックと後続のブロックを適切に解凍します
  2. 「距離が遠すぎます」エラーで失敗する

言い換えれば、不正なデータを黙って解凍しないことが保証されていますか (gzip の最後の CRC32 チェックについて話しているのではなく、zlib が大声で文句を言うかどうかについて話しているわけではありません)。

仮定:

  1. フラッシュポイントを完全に識別できると仮定します。ランダム ビットを同期マーカーと誤認したり、パターンがたまたまタイプ 0 ブロックに表示されたりしないと仮定しましょう。これは非現実的ですが、それが真実であると仮定してください。
  2. ファイルが破損することはなく、常に正規の gzip ファイルであると想定します。
4

1 に答える 1

1

Z_SYNC_FLUSH の結果として、距離が遠すぎるエラーが発生しない後続のストリームが発生した場合、偶然にも、それは Z_FULL_FLUSH と同等であり、区別がつきません。

これが頻繁に起こるとは思いません。

于 2013-05-14T03:57:28.137 に答える