¿Por qué BCL GZipStream (con StreamReader) no detecta de manera confiable los errores de datos con CRC32?

El otro día me encontré con la pregunta de que GZipStream no detecta datos corruptos (incluso los pases CRC32). (De lo cual esto podría ser un “duplicado”, tengo sentimientos encontrados sobre el tema. También fui quien agregó el CRC32 al título, pero en retrospectiva, se siente fuera de lugar con el rest de la publicación). Después de explorar el problema un poco por mi cuenta, creo que el problema es mucho mayor de lo que la otra pregunta inicialmente retrata.

Expandí la otra pregunta e hice que el código de prueba se ejecutara bajo LINQPad e intenté mostrar mejor el problema CRC32 (Comprobación de redundancia cíclica) , si es que existe. (Debido a que el código es solo una pequeña modificación basada en el original, es posible que la configuración / metodología de la prueba sea defectuosa o que exista otra rareza / PEBCAK).

Los resultados son extraños porque los datos corruptos no siempre causan una excepción (cualquiera) . Tenga en cuenta que solo algunas veces la comprobación CRC32 parece estar realmente “funcionando”. Los bytes corruptos que causan el index-out-of-range / bad header / bad footer se pueden ignorar porque podemos suponer que están matando la descompresión antes de la verificación CRC32 (lo cual es perfectamente comprensible , incluso si la IndexOutOfRangeException probablemente se envuelva) por una InvalidDataException) entonces,

¿Por qué el control CRC32 es significativamente menos confiable de lo que debería ser? (¿Por qué es que hay “Datos no válidos (sin excepción)” a continuación?)

Como el pie de página de GZip contiene tanto el CRC32 como la longitud de los datos sin comprimir, parece que la tasa de detección de errores debería ser “significativamente mayor” , es decir, no esperaría un solo caso de falla debajo, mucho menos un número de transmisiones corruptas no detectadas . (Por supuesto, es bueno detectar un vapor corrupto lo antes posible: pero la sum final de control de seguridad parece ser ignorada por completo en los casos).

El formato es CorruptByteIndex+FailedDetections: Message :

  0 + 0: System.IO.InvalidDataException: el número mágico en el encabezado GZip no es correcto.  Asegúrate de pasar en una transmisión GZip.
 1 + 0: System.IO.InvalidDataException: el número mágico en el encabezado GZip no es correcto.  Asegúrate de pasar en una transmisión GZip.
 2 + 0: System.IO.InvalidDataException: el modo de compresión especificado en el encabezado GZip es desconocido.
 3 + 0: buena información (sin excepción)
 4 + 0: buena información (sin excepción)
 5 + 0: buena información (sin excepción)
 6 + 0: buena información (sin excepción)
 7 + 0: buena información (sin excepción)
 8 + 0: buena información (sin excepción)
 9 + 0: buena información (sin excepción)
 10 + 0: System.IO.InvalidDataException: tipo de bloque desconocido.  Stream podría estar dañado.
 11 + 1: datos no válidos (sin excepción)
 12 + 1: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 13 + 1: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 14 + 1: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 15 + 1: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 16 + 1: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 17 + 2: datos no válidos (sin excepción)
 18 + 2: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 19 + 2: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 20 + 2: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 21 + 3: datos no válidos (sin excepción)
 22 + 3: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 23 + 3: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 24 + 4: datos no válidos (sin excepción)
 25 + 4: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 26 + 4: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 27 + 4: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 28 + 4: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 29 + 5: datos no válidos (sin excepción)
 30 + 5: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 31 + 6: datos no válidos (sin excepción)
 32 + 7: datos no válidos (sin excepción)
 33 + 7: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 34 + 7: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 35 + 7: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 36 + 8: datos no válidos (sin excepción)
 37 + 8: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 38 + 8: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 39 + 9: datos no válidos (sin excepción)
 40 + 9: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 41 + 9: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 42 + 10: datos no válidos (sin excepción)
 43 + 10: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 44 + 10: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 45 + 10: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 46 + 11: datos no válidos (sin excepción)
 47 + 11: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 48 + 11: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 49 + 11: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 50 + 12: datos no válidos (sin excepción)
 51 + 12: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 52 + 12: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 53 + 13: datos no válidos (sin excepción)
 54 + 13: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 55 + 14: datos no válidos (sin excepción)
 56 + 14: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 57 + 15: datos no válidos (sin excepción)
 58 + 15: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 59 + 15: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 60 + 16: datos no válidos (sin excepción)
 61 + 17: datos no válidos (sin excepción)
 62 + 18: datos no válidos (sin excepción)
 63 + 19: datos no válidos (sin excepción)
 64 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 65 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 66 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 67 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 68 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 69 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 70 + 19: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 71 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 72 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 73 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 74 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 75 + 19: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 76 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 77 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 78 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 79 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 80 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 81 + 19: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 82 + 19: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 83 + 20: datos no válidos (sin excepción)
 84 + 21: datos no válidos (sin excepción)
 85 + 22: datos no válidos (sin excepción)
 86 + 22: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 87 + 23: datos no válidos (sin excepción)
 88 + 24: datos no válidos (sin excepción)
 89 + 25: datos no válidos (sin excepción)
 90 + 25: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 91 + 26: datos no válidos (sin excepción)
 92 + 26: System.IO.InvalidDataException: se encontraron datos no válidos durante la deencoding.
 93 + 26: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 94 + 27: datos no válidos (sin excepción)
 95 + 27: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 96 + 27: System.IndexOutOfRangeException: Index estaba fuera de los límites de la matriz.
 97 + 28: datos no válidos (sin excepción)
 98 + 28: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 99 + 28: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 100 + 29: datos no válidos (sin excepción)
 101 + 30: datos no válidos (sin excepción)
 102 + 31: datos no válidos (sin excepción)
 103 + 32: datos no válidos (sin excepción)
 104 + 32: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 105 + 33: datos no válidos (sin excepción)
 106 + 34: datos no válidos (sin excepción)
 107 + 35: datos no válidos (sin excepción)
 108 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 109 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 110 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 111 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 112 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 113 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 114 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 115 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 116 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 117 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 118 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 119 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 120 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 121 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 122 + 35: System.IO.InvalidDataException: el CRC en el pie de página GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 123 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 124 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 125 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 126 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 127 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 128 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 129 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 130 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 131 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 132 + 35: System.IO.InvalidDataException: el CRC en el pie de página GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 133 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 134 + 35: System.IO.InvalidDataException: el CRC en el pie de página GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 135 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 136 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 137 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 138 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 139 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 140 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 141 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 142 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 143 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 144 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 145 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 146 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 147 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 148 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 149 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 150 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 151 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 152 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 153 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 154 + 35: System.IO.InvalidDataException: el CRC en el pie de página GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 155 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 156 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 157 + 35: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 158 + 36: datos no válidos (sin excepción)
 159 + 36: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 160 + 36: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 161 + 37: datos no válidos (sin excepción)
 162 + 38: datos no válidos (sin excepción)
 163 + 39: datos no válidos (sin excepción)
 164 + 40: datos no válidos (sin excepción)
 165 + 41: datos no válidos (sin excepción)
 166 + 41: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 167 + 41: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 168 + 41: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 169 + 41: System.IO.InvalidDataException: el CRC en el pie de página de GZip no coincide con el CRC calculado a partir de los datos descomprimidos.
 170 + 41: System.IO.InvalidDataException: el tamaño de la secuencia en el pie de página de GZip no coincide con el tamaño real de la secuencia.
 171 + 41: System.IO.InvalidDataException: el tamaño de la secuencia en el pie de página de GZip no coincide con el tamaño real de la secuencia.
 172 + 41: System.IO.InvalidDataException: el tamaño de la stream en el pie de página de GZip no coincide con el tamaño real de la secuencia.
 173 + 41: System.IO.InvalidDataException: el tamaño de la secuencia en el pie de página de GZip no coincide con el tamaño real de la secuencia. 

Aquí está la prueba que es copy’n’paste ejecutable en LINQPad (para .NET 3.5 y 4, use el modo “como declaraciones C #”):

  string sample = "This is a compression test of microsoft .net gzip compression method and decompression methods"; var encoding = new ASCIIEncoding(); var data = encoding.GetBytes(sample); string sampleOut = null; byte[] cmpData; // Compress using (var cmpStream = new MemoryStream()) { using (var hgs = new System.IO.Compression.GZipStream(cmpStream, System.IO.Compression.CompressionMode.Compress)) { hgs.Write(data, 0, data.Length); } cmpData = cmpStream.ToArray(); } int corruptBytesNotDetected = 0; // corrupt data byte by byte for (var byteToCorrupt = 0; byteToCorrupt < cmpData.Length; byteToCorrupt++) { var corruptData = new List(cmpData).ToArray(); // corrupt the data corruptData[byteToCorrupt]++; using (var decomStream = new MemoryStream(corruptData)) { using (var hgs = new System.IO.Compression.GZipStream(decomStream, System.IO.Compression.CompressionMode.Decompress)) { using (var reader = new StreamReader(hgs)) { string message; try { sampleOut = reader.ReadToEnd(); // if we get here, the corrupt data was not detected by GZipStream // ... okay so long as the correct data is extracted if (!sample.SequenceEqual(sampleOut)) { corruptBytesNotDetected++; message = "Invalid data (No Exception)"; } else { message = "Good data (No Exception)"; } } catch(Exception ex) { message = (ex.GetType() + ":" + ex.Message); } string.Format("{0}+{1}: {2}", byteToCorrupt, corruptBytesNotDetected, message).Dump(); } } } } 

Aquí están los datos comprimidos en .NET 3.5 (GZipStream es notoriamente malo en “compresión” de pequeñas cargas útiles, pero es un problema de “No se soluciona” porque la transmisión sigue siendo técnicamente válida):

  1F 8B 08 00 00 00 00 00 04 00 ED BD 07 60 1C 49 96 25 26 2F
 6D CA 7B 7F 4A F5 4A D7 E0 74 A1 08 80 60 13 24 D8 90 40 10
 EC C1 88 CD E6 92 CE 1D 69 47 23 29 AB 2A 81 CA 65 56 65 5D
 66 16 40 CC ED 9D BC F7 DE 7B EF BD F7 DE 7B EF BD F7 BA 3B
 9D 4E 27 F7 DF FF 3F 5C 66 64 01 6C F6 CE 4A DA C9 9E 21 80
 AA C8 1F 3F 7E 7C 1F 3F 22 DE CC 8B 26 A5 FF 65 E9 B4 5A AC
 EA BC 69 8A 6A 99 B6 79 D3 A6 D5 79 BA 28 A6 75 D5 54 E7 6D
 3A 5E E6 6D 7A F1 83 62 15 B4 5B E4 ED BC 9A A5 D9 72 96 CE
 F2 FE 17 CD FF 03 5C 51 5E 27 5E 00 00 00 

(Y, solo para risas, en .NET 4 genera una secuencia comprimida ligeramente más grande / diferente).

  1F 8B 08 00 00 00 00 00 04 00 EC BD 07 60 1C 49 96 25 26 2F
 6D CA 7B 7F 4A F5 4A D7 E0 74 A1 08 80 60 13 24 D8 90 40 10
 EC C1 88 CD E6 92 CE 1D 69 47 23 29 AB 2A 81 CA 65 56 65 5D
 66 16 40 CC ED 9D BC F7 DE 7B EF BD F7 DE 7B EF BD F7 BA 3B
 9D 4E 27 F7 DF FF 3F 5C 66 64 01 6C F6 CE 4A DA C9 9E 21 80
 AA C8 1F 3F 7E 7C 1F 3F 22 DE CC 8B 26 A5 FF 65 E9 B4 5A AC
 EA BC 69 8A 6A 99 B6 79 D3 A6 D5 79 BA 28 A6 75 D5 54 E7 6D
 3A 5E E6 6D 7A F1 83 62 15 B4 5B E4 ED BC 9A A5 D9 72 96 CE
 F2 FE 17 CD FF 13 00 00 FF FF 5C 51 5E 27 5E 00 00 00 

Notas adicionales:

La prueba puede ser sutilmente defectuosa en este caso. Cuando el GZipStream “no detecta la corrupción” (sin excepciones), los datos leídos del StreamReader son “” (una cadena vacía): en ese caso, ¿por qué ReadToEnd() no ReadToEnd() una excepción (IOException o de otro modo)?

Por lo tanto, ¿ no es GZipStream sino el StreamReader “peculiar” aquí o sigue siendo un problema con GZipStream (por no lanzar una Excepción)? ¿Hay alguna forma correcta de manejar este caso de uso de manera confiable? (Considere cuando la stream de entrada desde la posición actual realmente está vacía).

Prefacio

Los usuarios de .NET [4 y anteriores] no deben usar las clases GZipStream o DeflateStream proporcionadas por Microsoft bajo ninguna circunstancia, a menos que Microsoft las reemplace por completo con algo que funcione. Use la biblioteca DotNetZip en su lugar.

Actualización al Prefacio

.NET Framework 4.5 y posterior han solucionado el problema de compresión, y GZipStream y DeflateStream usan zlib en esas versiones. No sé si se ha solucionado el problema de CRC a que se hace referencia a continuación.

Otra actualización

¡La falla de CRC no solo no está solucionada, sino que Microsoft decidió que no la solucionará !

Mi respuesta en ¿Por qué mi C # gzip produce un archivo más grande que Fiddler o PHP? muestra que este comportamiento no refleja una implementación adecuada de la detección de corrupción gzip. En todos los casos probados, el error se detectaría mediante una implementación adecuada. (Esa respuesta también señala por qué siete de los casos dan como resultado buenos datos).

Otra pregunta es: ¿cómo este método de “compresión” produce 174 bytes de salida de una cadena de 94 bytes? Especialmente viendo cómo la cuerda es compresible, gzip la reduce a 84 bytes, incluso con la sobrecarga de un encabezado de 18 bytes y un avance. ¿Puedes proporcionar un volcado hexadecimal de esos 174 bytes?