9

いくつかのファイルがあり、いくつかのランダムなバイトと複数の gzip ファイルがあります。一部のファイル内でgzipストリームの開始と終了を見つけるにはどうすればよいですか? gzip ストリーム間に多くのランダム バイトがあります。したがって、基本的には gzip ファイルを見つけてそこから取得する必要があります。

4

2 に答える 2

11

RFC 1952からの読み取り-GZIP

各GZIPファイルは、含まれるファイルごとに1つずつ、データチャンク(メンバーと呼ばれる)の集まりにすぎません。

各メンバーは次のバイトで始まります。

  • 0x1F(ID1)
  • 0x8B(ID2)
  • 圧縮方法。dファイルの場合は0x08 。DEFLATE0〜7は予約値です。
  • フラグ。上位3ビットは予約されており、ゼロでなければなりません
  • (4バイト)最終変更時刻。0に設定できます。
  • 圧縮方法によって定義された追加のフラグ。
  • オペレーティングシステム、実際にはファイルシステム。0 = FAT、3 = UNIX、11 = NTFS

メンバーの終わりは区切られていません。あなたは実際にメンバー全員を歩かなければなりません。複数の有効なGZIPファイルを連結すると、有効なGZIPファイルが作成されることに注意してください。また、メンバーをオーバーシュートすると、メンバーの読み取りが成功する可能性があることにも注意してください(解凍ライブラリが熱心に完全に失敗しない限り)。

于 2012-10-28T20:54:45.533 に答える
5

3 バイトの gzip 署名 0x1f 0x8b 0x08 を検索します。見つかったら、0x1f で始まる gzip ストリームをデコードしてみてください。成功した場合、それは gzip ストリームであり、終了したところで終了しました。gzip ストリームがある場合はその後から、そうでない場合は 0x08 の後から検索を続けます。次に、それらすべてを見つけて、それらの位置とスパンを知ることができます。

于 2012-10-28T20:59:07.300 に答える