System.IO.Compression.GZipStreamまたはSystem.IO.Compression.Deflateはzlib圧縮と互換性がありますか?Zlib互換の圧縮ストリーム?
答えて
:
このクラスは、ロスレスファイル圧縮・解凍のための業界標準アルゴリズムを使用したgzipデータ形式を表します。 zlib FAQから
:
zlibの中GZ *関数一方、gzip形式を使用します。
zlibとGZipStreamは、gzip形式を扱うためにzlib関数を使用する場合にのみ、zlibとGZipStreamが相互運用可能である必要があります。
System.IO.Compression.Deflateとzlibは、相互運用性がないとされています。
zipファイルを処理する必要がある場合(そうでないかもしれませんが、他の人がこれを必要とする場合があります)、SharpZipLibまたは別のサードパーティライブラリを使用する必要があります。
zlibまたはdeflateアルゴリズムを使用してデータを圧縮するだけで、特定のファイル形式の出力は提供されません。つまり、ストリームをそのままハードディスクに保存した場合、ファイルヘッダー(マジックナンバーなど)がストリームに含まれていないため、アプリケーション(gzipまたはwinrar)を使用してストリームを開くことはできませんそれらをあなた自身で書いてください。
私はandreasに同意します。おそらく外部ツールでファイルを開くことはできませんが、そのツールがストリームを予期していれば、それを使用できるかもしれません。また、同じ圧縮クラスを使用してファイルを収縮させることもできます。
gzipは、チェックサムや長さなど、いくつかのヘッダー/フッターデータです。したがって、一方のメソッドが他方のストリームを使用できるという意味では互換性がありませんが、同じ圧縮アルゴリズムを使用します。 System.IO.Compression.GZipStreamについてMSDNから
私は.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で圧縮されています(このスレッドでは他にもヘッダ情報があります)。しかし、この違いは実際問題ではないようです。
はチャームのように機能します! 私がパフォーマンステストに使用しているビッグデータセットは、55MBからわずか7.5MBに圧縮されており、顕著なパフォーマンスの低下はありません。 S. "file"の名前を "file.gz"に変更すると、完全に有効なアーカイブファイルになります。任意のアーカイブツールを使用してコンテンツを変更することもできます。また、あなたのメソッドを使用して逆シリアル化が可能です。 – Soonts
DotNetZipには、RFC 1950、1951、および1952を処理するDeflateStream、ZlibStream、およびGZipStreamが含まれています。すべてDEFLATEアルゴリズムを使用しますが、フレーミングバイトとヘッダーバイトはそれぞれ異なります。
利点として、DotNetZipのストリームは圧縮下でanomaly of expanding data sizeを表示せず、組み込みのストリームに対して報告されています。また、ZlibStreamはビルトインされていませんが、DotNetZipはzlibとの良好な相互運用性のためにそれを提供します。
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;
}
}
}
を作って、それはそれはかなりでした。
.NET Framework 4.5以降では、System.IO.Compression.DeflateStream
クラスはzlibライブラリを使用します。クラスのMSDN articleから
:
このクラスは、ロスレスファイル圧縮・解凍のための業界標準アルゴリズムであるデフレートアルゴリズムを表します。 .NET Framework 4.5以降、DeflateStreamクラスはzlibライブラリを使用します。その結果、より良い圧縮アルゴリズムと、ほとんどの場合、以前のバージョンの.NET Frameworkで提供されていたよりも圧縮されたファイルが小さくなります。
- 1. 圧縮解除Zlib
- 2. MSP430でのZlib圧縮
- 3. データ圧縮解除zlib
- 4. データ圧縮ライブラリ:brotli vs zlib
- 5. zlib圧縮と復元
- 6. ZLib PNG 1ビット深度の圧縮
- 7. 成長バッファ(C++、zlib)の累積圧縮
- 8. Javaのzlib圧縮解除エラー
- 9. Python:圧縮解除zlib文字列
- 10. zlibでバッファを圧縮するには?
- 11. C(ZLIB)圧縮配列のPHP(ZLIB)圧縮解除の不具合が返ります
- 12. 圧縮のためにzlibを使用して圧縮データサイズを計算する
- 13. Nodejsでzlibを使用したデータの圧縮と圧縮解除
- 14. ストリームから直接圧縮
- 15. C#をストリームから圧縮して圧縮する
- 16. YUI圧縮?君?ヨーロッパの手紙との互換性?
- 17. LZ4圧縮のソースコードは64ビット互換ですか?
- 18. Poco HTTPServerResponseへのストリームPoco Zip圧縮
- 19. pako(zlibはjavascript)で圧縮され、zlib(python)は動作しません。
- 20. boost :: iostream zlib複数のファイルを1つのアーカイブに圧縮
- 21. zlibのgzipファイルアクセス関数を使用した非圧縮ファイルサイズ
- 22. zlibを使ってCの整数配列を圧縮する
- 23. zlibを使ってCythonのNumPy配列を圧縮する
- 24. JavaのDeflateクラスとInflateクラスを使用したZlib圧縮
- 25. ストリームへの低レベルのアクセスでzlib形式で圧縮しようとしています
- 26. php zlib圧縮サポートが動作しません
- 27. hadoopでネイティブzlib圧縮ライブラリを無効にする方法
- 28. zlibを使用して圧縮ファイルに追加
- 29. zlibディスクに書き込むことなく圧縮する
- 30. ZlibをRubyのストリームに圧縮するにはどうすればよいですか?
zipファイルはzlib圧縮ファイルと同じではありません(圧縮アルゴリズムは同じかもしれませんが、ヘッダーはありません) –
あなたは正しいです。私は自分の反応を編集する。 –
:zlibとDeflateStreamに関する「報告された相互運用性がない」彼らは事実上相互運用性がありません。この領域をカバーするIETF RFCには、ZLIBでは1950、DEFLATEでは1951、GZIPでは1952の3つのRFCがあります。 Deflateは圧縮アルゴリズムです。 ZLIBとGZIPは、圧縮されたストリームに適用されるメタデータ(別名「ヘッダ」)を定義する明確なフォーマットです。 zlibライブラリは、ZLIBとGZIPの両方を実装しています。興味深いことに、ZLIBとGZIPの両方で圧縮メカニズムとしてDEFLATEを使用できます。 DeflateStreamクラスは、裸のヘッダレスストリームを生成します。私たちはすべて混乱しているのは不思議ではありません。 – Cheeso