Aquí está el código del proyecto real, adoptado para la pregunta, por lo que algunos datos están codificados:
static void Main(string[] args) { Console.WriteLine("Starting. " + Environment.Version); using (var stream = new FileStream(@"stream_test.txt", FileMode.Open)) { stream.Position = 0; // .NET implements Deflate (RFC 1951) but not zlib (RFC 1950), // so we have to skip the first two bytes. stream.ReadByte(); stream.ReadByte(); var zipStream = new DeflateStream(stream, CompressionMode.Decompress, true); // Hardcoded length from real project. In the previous .Net versions this is size of final result long bytesToRead = (long)262 * 350; var buffer = new byte[bytesToRead]; int bytesWereRead = zipStream.Read(buffer, 0, (int)bytesToRead); if (bytesWereRead != bytesToRead) { throw new Exception("ZIP stream was not fully decompressed."); } Console.WriteLine("Ok"); Console.ReadKey(); } }El problema con la descompresión no aparece en cada transmisión, por lo que el archivo de entrada se puede encontrar en GitHub con el código del proyecto. https://github.com/dimsa/Net6DeflateStreamIssue/tree/main/DeflateStreamTest
Este código funciona bien en:
.NET 6 falla. Los datos descomprimidos en Net 6 tienen una longitud incorrecta.
¿Hay alguna solución alternativa o se deben usar otras bibliotecas de compresión?
Hubo un cambio importante en la forma en que DeflateStream opera en .NET 6. Puede obtener más información al respecto y las acciones recomendadas en esta documentación de Microsoft .
Básicamente, debe envolver la operación .Read y verificar la longitud leída frente a la longitud esperada porque la operación ahora puede regresar antes de leer la longitud completa. Su código podría tener este aspecto (basado en el ejemplo de la documentación):
int totalRead = 0; var buffer = new byte[bytesToRead]; while (totalRead < buffer.Length) { int bytesRead = zipStream.Read(buffer.Slice(totalRead)); if (bytesRead == 0) break; totalRead += bytesRead; }