2010-04-08 4 views
45

La documentación de MSDN me dice lo siguiente:clase GZipStream o DeflateStream?

La clase GZipStream utiliza el formato de datos gzip , que incluye un valor de comprobación de redundancia cíclica para detectar corrupción de datos. El formato de datos gzip usa el mismo algoritmo de compresión que la clase DeflateStream.

Parece que GZipStream agrega algunos datos adicionales a la salida (en relación con DeflateStream). Me pregunto, ¿en qué tipo de escenario sería esencial usar GZipStream y no DeflateStream?

+0

¿Alguna razón por la que no está utilizando el código postal? – Simon

Respuesta

63

Deflate es solo el algoritmo de compresión. GZip es en realidad un formato.

Si utiliza el GZipStream para comprimir un archivo (y guardarlo con la extensión .gz), el resultado en realidad se puede abrir archivadores como WinZip o la herramienta gzip. Si comprime con un DeflateStream, esas herramientas no reconocerán el archivo.

Si el archivo comprimido está diseñado para ser abierto por estas herramientas, entonces es esencial usar GZipStream en lugar de DeflateStream.

También lo consideraría esencial si transfiere una gran cantidad de datos a través de un medio no confiable (es decir, una conexión a Internet) y no utiliza un protocolo de corrección de errores como TCP/IP. Por ejemplo, puede estar transmitiendo a través de un puerto serie, un socket sin formato o UDP. En este caso, definitivamente querrá la información CRC que está incrustada en el formato GZip para garantizar que los datos sean correctos.

5

Bueno, estaba completamente equivocado en mi primera respuesta. He mirado en el código fuente mono y encontró que la clase GZipStream realidad vuelve a dirigir su lectura/escritura (y casi cualquier otro) las llamadas a un llamadas adecuadas de métodos de un objeto DeflateStream interna:

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

La única diferencia, es que siempre crea un objeto DeflateStream con un indicador gzip establecido en verdadero. Esto ciertamente no es una respuesta a su pregunta, pero tal vez ayude un poco.

8

GZipStream es lo mismo que DeflateStream pero agrega algo de CRC para garantizar que los datos no tengan ningún error.

0

Mientras que GZipStream parece estar utilizando DeflateStream para hacer la descompresión, los dos algoritmos no parecen ser intercambiables. El siguiente código de prueba le dará una excepción:

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