GZipStream- of DeflateStream-klasse?

De MSDN-documentatie vertelt me ​​het volgende:

De klasse GZipStream gebruikt de gzip
gegevensformaat, dat een cyclisch
redundantiecontrolewaarde voor detectie
data corruptie. Het gzip-gegevensformaat
gebruikt hetzelfde compressie-algoritme als
de DeflateStream-klasse.

Het lijkt erop dat GZipStream wat extra gegevens toevoegt aan de uitvoer (ten opzichte van DeflateStream). Ik vraag me af, in welk type scenario zou het essentieel zijn om GZipStream te gebruiken en niet DeflateStream?


Antwoord 1, autoriteit 100%

Deflate is slechts het compressiealgoritme. GZip is eigenlijk een formaat.

Als u de GZipStreamgebruikt om een ​​bestand te comprimeren (en het op te slaan met de extensie .gz), kan het resultaat daadwerkelijk worden geopend door archiveringsprogramma’s zoals WinZip of de gzip-tool. Als je comprimeert met een DeflateStream, zullen die tools het bestand niet herkennen.

Als het gecomprimeerde bestand is ontworpen om door deze tools te worden geopend, is het essentieel om GZipStreamte gebruiken in plaats van DeflateStream.

Ik zou het ook essentieel vinden als je een grote hoeveelheid gegevens overdraagt ​​via een onbetrouwbaar medium (d.w.z. een internetverbinding) en geen foutcorrigerend protocol zoals TCP/IP gebruikt. U verzendt bijvoorbeeld mogelijk via een seriële poort, onbewerkte socket of UDP. In dit geval wilt u zeker de CRC-informatie die is ingesloten in het GZip-formaat om ervoor te zorgen dat de gegevens correct zijn.


Antwoord 2, autoriteit 15%

GZipStream is hetzelfde als DeflateStream, maar het voegt wat CRC toe om ervoor te zorgen dat de gegevens geen fouten bevatten.


Antwoord 3, autoriteit 6%

Nou, ik had het helemaal mis in mijn eerste antwoord. Ik heb opgezocht in de Mono-broncode en ontdekte dat de GZipStream-klasse zijn lees-/schrijfaanroepen (en bijna alle andere) aanroepen omleidt naar geschikte aanroepen van methoden van een intern DeflateStream-object:

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

Het enige verschil is dat het altijd een DeflateStream-object maakt met een gzip-vlag ingesteld op true.
Dit is zeker geen antwoord op je vraag, maar misschien helpt het een beetje.


Antwoord 4

Dito volgens Aaronaught

Let op een ander belangrijk verschil volgens
http://www.webpronews.com/gzip-vs -deflate-compression-and-performance-2006-12:

Ik heb de DeflateStream tot 41% sneller gemeten dan GZip.

Ik heb de snelheid niet gemeten, maar ik heb de bestandsgrootte gemeten als appx. hetzelfde.


Antwoord 5

Hoewel GZipStream DeflateStream lijkt te gebruiken voor decompressie, lijken de twee algoritmen niet uitwisselbaar. De volgende testcode geeft u een uitzondering:

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

Other episodes