Frage

Sind System.IO.Compression.GZipStream oder System.IO.Compression.Deflate mit der zlib-Komprimierung kompatibel?

War es hilfreich?

Lösung

MSDN über System.IO .Compression.GZipStream:

  

Diese Klasse stellt das gzip-Datenformat, das einen Industriestandard-Algorithmus für störfreie Datei-Komprimierung und Dekomprimierung verwendet wird.

Von der zlib FAQ :

  

Die gz * Funktionen in zlib auf der anderen Seite das gzip-Format verwenden.

So zlib und GZipStream sollten kompatibel sein, aber nur, wenn Sie die zlib-Funktionen für die Handhabung des gzip-Format verwenden.

System.IO.Compression.Deflate und zlib ist angeblich nicht kompatibel.

Wenn Sie ZIP-Dateien verarbeiten (Sie wahrscheinlich nicht, aber jemand anderes könnte dies benötigen) Sie verwenden müssen, SharpZipLib oder andere Drittanbieter-Bibliothek.

Andere Tipps

DotNetZip Enthält einen DeflateStream, einen ZlibStream und einen GZipStream zur Verarbeitung von RFC 1950, 1951 und 1952.Alle verwenden den DEFLATE-Algorithmus, aber die Rahmen- und Header-Bytes sind bei jedem unterschiedlich.

Ein Vorteil ist, dass die Streams in DotNetZip das nicht aufweisen Anomalie der wachsenden Datengröße unter Komprimierung, für die integrierten Streams gemeldet.Außerdem gibt es keinen integrierten ZlibStream, wohingegen DotNetZip Ihnen diesen bietet, um eine gute Interoperabilität mit zlib zu gewährleisten.

Ich lief in dieser Frage mit Git-Objekte. In diesem speziellen Fall, sie speichern die Objekte als entleerten Blobs mit einem Zlib-Header, der in RFC 1950 dokumentiert . Sie können eine kompatible blob machen eine Datei, indem das enthält:

  • Zwei Header-Bytes (CMF und FLG von RFC 1950) mit den Werten 0x78 0x01
    • CM = 8 = deflate
    • CINFO = 7 = 32 Kb Fenster
    • FCHECK = 1 = Prüfsumme Bits für diesen Header
  • Die Ausgabe des C # DeflateStream
  • Eine Adler32 Prüfsumme der Eingangsdaten an den DeflateStream, Big-Endian-Format (MSB zuerst)

Ich habe meine eigene Adler Umsetzung

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;
        }
    }
}

Und das war ziemlich viel es.

Ich habe GZipStream verwendet, um die Ausgabe von dem .NET XmlSerializer zu komprimieren und es hat funktioniert völlig in Ordnung, das Ergebnis mit gunzip (in Cygwin), Winzip und anderen GZipStream zu dekomprimieren.

Als Referenz hier ist, was ich in Code hat:

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);
}

Dann dekomprimiert in 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);
}

‚Datei‘ Dienstprogramm in Cygwin zeigt, dass es tatsächlich einen Unterschied zwischen der gleichen Datei mit GZipStream komprimiert und mit GNU GZIP (wahrscheinlich Header-Informationen wie die anderen in diesem Thread ausgeführt hat). Dieser Unterschied scheint jedoch in der Praxis keine Rolle spielen.

gzip ist abzulassen + einige Kopf- / Fußzeilen Daten, wie eine Prüfsumme und Länge, etc. So sie nicht in dem Sinne kompatibel sind, dass ein Verfahren einen Strom von dem anderen verwenden können, aber sie verwenden den gleichen Kompressionsalgorithmus.

Sie Komprimieren nur die Daten zlib mit oder Algorithmen abzulassen, aber die Ausgabe für einiges spezifisches Dateiformat nicht geben. Das bedeutet, dass, wenn Sie den Strom zu speichern auf die Festplatte wie sie ist höchstwahrscheinlich werden Sie nicht in der Lage sein, um es zu öffnen einig Programm (gzip oder WinRAR), da die Datei-Header (magische Zahl, usw.) ist nicht in Strom enthält ein sollten Sie schreiben sie selbst.

Starten von .NET Framework 4.5 die System.IO.Compression.DeflateStream Klasse verwendet die zlib-Bibliothek.

Von der Klasse der MSDN-Artikel :

  

Diese Klasse stellt den Deflate-Algorithmus, der für die verlustfreie Datei Komprimierung und Dekomprimierung ein Industrie-Standard-Algorithmus ist. Beginnend mit dem .NET Framework 4.5 verwendet die DeflateStream Klasse die zlib-Bibliothek. Als Ergebnis liefert es einen besseren Komprimierungsalgorithmus und in den meisten Fällen eine kleinere komprimierte Datei als es früher in Versionen von .NET Framework bietet.

Ich bin mit andreas. Sie werden wahrscheinlich nicht in der Lage sein, die Datei in einem externen Tool zu öffnen, aber wenn das Werkzeug einen Strom erwartet könnten Sie in der Lage sein, es zu benutzen. Sie wäre auch in der Lage, die Datei abzulassen wieder die gleiche Kompressionsklasse verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top