web-dev-qa-db-ja.com

GZipStreamまたはDeflateStreamクラス?

MSDNのドキュメントでは、次のことがわかります。

GZipStreamクラスは、データの破損を検出するための巡回冗長検査値を含むgzipデータ形式を使用します。 gzipデータ形式は、DeflateStreamクラスと同じ圧縮アルゴリズムを使用します。

GZipStreamは出力にいくつかの追加データを追加するようです(DeflateStreamと比較して)。 DeflateStreamではなくGZipStreamを使用する必要があるのは、どのタイプのシナリオですか?

53

Deflateは単なる圧縮アルゴリズムです。 GZipは実際にはフォーマットです。

GZipStreamを使用してファイルを圧縮する(そして拡張子.gzを付けて保存する)と、WinZipやgzipツールなどのアーカイバーが結果を実際に開くことができます。 DeflateStreamで圧縮すると、これらのツールはファイルを認識しません。

これらのツールで圧縮ファイルを開くように設計されている場合は、GZipStreamではなくDeflateStreamを使用することが不可欠です。

また、TCP/IPなどのエラー修正プロトコルを使用せずに、信頼性の低いメディア(インターネット接続など)を介して大量のデータを転送する場合も、重要だと考えます。たとえば、シリアルポート、rawソケット、またはUDPを介して送信している場合があります。この場合、データが正しいことを確認するために、GZip形式に埋め込まれたCRC情報が確実に必要になります。

70
Aaronaught

GZipStreamはDeflateStreamと同じですが、CRCを追加して、データにエラーがないことを確認します。

12
agnain

さて、私は最初の答えで完全に間違っていました。私はMonoソースコードを調べたところ、GZipStreamクラスが実際にその読み取り/書き込み(およびその他のほとんどすべての)呼び出しを内部DeflateStreamオブジェクトのメソッドの適切な呼び出しにリダイレクトしていることがわかりました。

public override int Read (byte[] dest, int dest_offset, int count)
{
    return deflateStream.Read(dest, dest_offset, count);
}

public override void Write (byte[] src, int src_offset, int count)
{
    deflateStream.Write (src, src_offset, count);
}

唯一の違いは、常にgzipフラグをtrueに設定してDeflateStreamオブジェクトを作成することです。これは確かにあなたの質問への答えではありませんが、多分それは少し役立つでしょう。

6
n535

アーロノートによるディト

別の重要な違いに注意してください
http://www.webpronews.com/gzip-vs-deflate-compression-and-performance-2006-12

私はDeflateStreamをGZipより41%速く測定しました。

速度は測定しませんでしたが、ファイルサイズをappxと測定しました。同じ。

2
Stefan Steiger

GZipStreamはDeflateStreamを使用して解凍を行っているようですが、2つのアルゴリズムには互換性がないようです。次のテストコードは例外を与えます:

        MemoryStream wtt=new MemoryStream();
        using (var gs=new GZipStream(wtt,CompressionMode.Compress,true))
        {
            using (var sw=new StreamWriter(gs,Encoding.ASCII,1024,true))
            {
                sw.WriteLine("Hello");
            }
        }
        wtt.Position = 0;
        using (var ds = new DeflateStream(wtt, CompressionMode.Decompress, true))
        {
            using (var sr=new StreamReader(ds,Encoding.ASCII,true,1024,true))
            {
                var txt = sr.ReadLine();
            }
        }
1
Arsen Zahray