desde descomprimir decompress create compressionmode compress archivos c# .net compression

c# - descomprimir - using zipfile



¿Clase GZipStream o DeflateStream? (5)

La documentación de MSDN me dice lo siguiente:

La clase GZipStream usa el formato de datos gzip, que incluye un valor de verificación de redundancia cíclica para detectar daños en los datos. El formato de datos gzip utiliza 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?


Bueno, estaba completamente equivocado en mi primera respuesta. Busqué en el código fuente de Mono y descubrí que la clase GZipStream realmente redirige sus llamadas de lectura / escritura (y casi cualquier otra) a una llamada apropiada de métodos de un objeto interno DeflateStream:

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 tu pregunta, pero quizás ayude un poco.


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

Si usa GZipStream para comprimir un archivo (y guárdelo con la extensión .gz ), los archivos como WinZip o la herramienta gzip pueden abrir el resultado. 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, es esencial usar GZipStream lugar de DeflateStream .

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



GZipStream es el mismo que DeflateStream pero agrega algunos CRC para garantizar que los datos no tengan errores.


Mientras que GZipStream parece estar usando DeflateStream para hacer 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(); } }