2008-09-16 37 views

答えて

9

このクラスは、ロスレスファイル圧縮・解凍のための業界標準アルゴリズムを使用したgzipデータ形式を表します。 zlib FAQから

zlibの中GZ *関数一方、gzip形式を使用します。

zlibとGZipStreamは、gzip形式を扱うためにzlib関数を使用する場合にのみ、zlibとGZipStreamが相互運用可能である必要があります。

System.IO.Compression.Deflateとzlibは、相互運用性がないとされています。

zipファイルを処理する必要がある場合(そうでないかもしれませんが、他の人がこれを必要とする場合があります)、SharpZipLibまたは別のサードパーティライブラリを使用する必要があります。

+1

zipファイルはzlib圧縮ファイルと同じではありません(圧縮アルゴリズムは同じかもしれませんが、ヘッダーはありません) –

+0

あなたは正しいです。私は自分の反応を編集する。 –

+21

:zlibとDeflateStreamに関する「報告された相互運用性がない」彼らは事実上相互運用性がありません。この領域をカバーするIETF RFCには、ZLIBでは1950、DEFLATEでは1951、GZIPでは1952の3つのRFCがあります。 Deflateは圧縮アルゴリズムです。 ZLIBとGZIPは、圧縮されたストリームに適用されるメタデータ(別名「ヘッダ」)を定義する明確なフォーマットです。 zlibライブラリは、ZLIBとGZIPの両方を実装しています。興味深いことに、ZLIBとGZIPの両方で圧縮メカニズムとしてDEFLATEを使用できます。 DeflateStreamクラスは、裸のヘッダレスストリームを生成します。私たちはすべて混乱しているのは不思議ではありません。 – Cheeso

2

zlibまたはdeflateアルゴリズムを使用してデータを圧縮するだけで、特定のファイル形式の出力は提供されません。つまり、ストリームをそのままハードディスクに保存した場合、ファイルヘッダー(マジックナンバーなど)がストリームに含まれていないため、アプリケーション(gzipまたはwinrar)を使用してストリームを開くことはできませんそれらをあなた自身で書いてください。

0

私はandreasに同意します。おそらく外部ツールでファイルを開くことはできませんが、そのツールがストリームを予期していれば、それを使用できるかもしれません。また、同じ圧縮クラスを使用してファイルを収縮させることもできます。

3

gzipは、チェックサムや長さなど、いくつかのヘッダー/フッターデータです。したがって、一方のメソッドが他方のストリームを使用できるという意味では互換性がありませんが、同じ圧縮アルゴリズムを使用します。 System.IO.Compression.GZipStreamについてMSDNから

6

私は.NET XmlSerializerの出力を圧縮するためにGZipStreamを使用していますが、gunzip(cygwin)、winzip、および別のGZipStreamを使用して結果を完全に解凍しても問題ありません。

参考のために、ここで私は、コードにやったことだ。そして、

FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write); 
using (GZipStream gzStream = new GZipStream(fs, CompressionMode.Compress)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); 
    serializer.Serialize(gzStream, myData); 
} 

、cygwinの中に「ファイル」ユーティリティを使用して、C#で

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); 
using (Stream input = new GZipStream(fs, CompressionMode.Decompress)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); 
    myData = (MyDataType) serializer.Deserialize(input); 
} 

を解凍するとの差は確かに存在していることが明らかになりました同じファイルがGZipStreamとGNU Gzipで圧縮されています(このスレッドでは他にもヘッダ情報があります)。しかし、この違いは実際問題ではないようです。

+1

はチャームのように機能します! 私がパフォーマンステストに使用しているビッグデータセットは、55MBからわずか7.5MBに圧縮されており、顕著なパフォーマンスの低下はありません。 S. "file"の名前を "file.gz"に変更すると、完全に有効なアーカイブファイルになります。任意のアーカイブツールを使用してコンテンツを変更することもできます。また、あなたのメソッドを使用して逆シリアル化が可能です。 – Soonts

14

DotNetZipには、RFC 1950、1951、および1952を処理するDeflateStream、ZlibStream、およびGZipStreamが含まれています。すべてDEFLATEアルゴリズムを使用しますが、フレーミングバイトとヘッダーバイトはそれぞれ異なります。

利点として、DotNetZipのストリームは圧縮下でanomaly of expanding data sizeを表示せず、組み込みのストリームに対して報告されています。また、ZlibStreamはビルトインされていませんが、DotNetZipはzlibとの良好な相互運用性のためにそれを提供します。

12

Gitオブジェクトでこの問題が発生しました。その特定のケースでは、Zlibヘッダーを使用してオブジェクトを収縮したブロブとして格納します。これはRFC 1950に記載されています。あなたが含まれているファイルを行うことで、互換性のあるブロブを行うことができます

  • 2つのヘッダバイト(RFC 1950からCMFとFLG)値で0x78 0x01
    • CM = 8 =
    • CINFO = 7を収縮しますこのヘッダ
  • の出力のため= 32Kbのウィンドウ
  • FCHECK = 1 =チェックサム・ビットビッグエンディアンフォーマット(MSBファースト)DeflateStream、とC#DeflateStream
  • 入力データのアンAdler32チェックサム

私は自分アドラー実装

public class Adler32Computer 
{ 
    private int a = 1; 
    private int b = 0; 

    public int Checksum 
    { 
     get 
     { 
      return ((b * 65536) + a); 
     } 
    } 

    private static readonly int Modulus = 65521; 

    public void Update(byte[] data, int offset, int length) 
    { 
     for (int counter = 0; counter < length; ++counter) 
     { 
      a = (a + (data[offset + counter])) % Modulus; 
      b = (b + a) % Modulus; 
     } 
    } 
} 

を作って、それはそれはかなりでした。

1

.NET Framework 4.5以降では、System.IO.Compression.DeflateStreamクラスはzlibライブラリを使用します。クラスのMSDN articleから

このクラスは、ロスレスファイル圧縮・解凍のための業界標準アルゴリズムであるデフレートアルゴリズムを表します。 .NET Framework 4.5以降、DeflateStreamクラスはzlibライブラリを使用します。その結果、より良い圧縮アルゴリズムと、ほとんどの場合、以前のバージョンの.NET Frameworkで提供されていたよりも圧縮されたファイルが小さくなります。

関連する問題