14

2 つ以上の gzip ストリームを再圧縮せずに連結したい。

つまり、A を A.gz に圧縮し、B を B.gz に圧縮しました。C または C++ を使用して、もう一度圧縮せずにそれらを単一の gzip (A+B).gz に圧縮したいと考えています。

いくつかのメモ:

  • 2 つのファイルを連結するだけで、gunzip はそれらの処理方法を知っていても、ほとんどのプログラムは 2 つのチャンクを処理できません。
  • ファイルを解凍してから元のファイルを操作するだけでこれを行うコードの例を一度見たことがありますが、これは通常の再圧縮よりもはるかに高速ですが、それでも O(n) CPU 操作が必要です。
  • 残念ながら、私が一度見つけたこの例 (解凍のみを使用した連結) を見つけることができません。

注:提案されたソリューションは私のニーズに合わないため、これは重複していません。

清算編集:

いくつかの圧縮された HTML pices を連結し、それらを 1 つのページとしてブラウザーに送信したい: "Accept-Encoding: gzip"、応答は "Content-Encoding: gzip"

ストリームが のように単純に連結されている場合cat a.gz b.gz >ab.gz、Gecko (firefox) および KHTML Web エンジンは最初の部分 (a) のみを取得します。IE6 では何も表示されず、Google Chrome では最初の部分 (a) が正しく表示され、2 番目の部分 (b) はガベージとして表示されます (まったく解凍されません)。

これをうまく処理できるのは Opera だけです。

したがって、いくつかのチャンクからなる単一のgzip ストリームを作成し、再圧縮せずに送信する必要があります。

更新: zlib の例でgzjoin.cを見つけました。解凍のみを使用して実行します。問題は、解凍がまだ遅いということmemcpyです。

最速の gzip 圧縮よりも 4 倍高速です。しかし、それだけでは十分ではありません。

必要なのは、解凍手順を実行しないために gzip ファイルと一緒に保存する必要があるデータを見つけることと、圧縮中にこのデータを見つける方法です。

4

4 に答える 4

14

RFC1951RFC1952を見てください

形式は単純にメンバーのスイートであり、それぞれがヘッダー、データ、およびトレーラーの3つの部分で構成されています。データ部分はそれ自体がチャンクのセットであり、各チャンクにはヘッダーとデータ部分があります。

2つ(またはそれ以上)の連結の結果をgzipする効果をシミュレートするには、ヘッダー(たとえば、最後のチャンクフラグがあります)とトレーラーを正しく調整し、データ部分をコピーするだけです。

問題があります。トレーラーには非圧縮データのCRC32があり、パーツのCRCがわかっている場合、これが簡単に計算できるかどうかはわかりません。

編集:あなたが見つけたgzjoin.cファイルのコメントは、データを解凍せずにCRC32を計算することは可能ですが、解凍が必要なものが他にもあることを示唆しています。

于 2009-07-17T13:57:57.230 に答える
6

gzip のマニュアルには、試みたとおりに 2 つの gzip ファイルを連結できると書かれています。

http://www.gnu.org/software/gzip/manual/gzip.html#高度な使い方

そのため、他のツールが壊れている可能性があります。このバグレポートに見られるように。 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97263

それぞれのブラウザー メーカーにバグ レポートを提出し、彼らが準拠することを期待する以外に、おそらくあなたのプログラムは、必要なデータの最も一般的な連結をキャッシュすることができます。

他の人が言及しているように、手術を行うことができるかもしれません: http://www.gzip.org/zlib/rfc-gzip.html

これには、最終的な非圧縮ファイルの CRC-32 が必要です。圧縮されていないファイルの必要なサイズは、個々のサブファイルの長さを加算することで簡単に計算できます。

最後のリンクの下部に、update_crc という名前の実行中の crc-32 を計算するためのコードがあります。

プロセスが実行されるたびに圧縮されていないファイルの crc を計算することは、おそらく gzip アルゴリズム自体よりも安価です。

于 2009-07-28T18:01:08.373 に答える
1

それらを ing することが問題外でない場合tar(リンクされたcatソリューションは実行可能ではないため):

tar cf A_B.gz.tar A.gz B.gz

次に、それらを元に戻すには:

tar xf A_B.gz.tar
于 2009-07-17T13:41:06.767 に答える