GZipStream e DeflateStream não descompactam todos os bytes

Eu precisava de uma maneira de compactar imagens no .net, então procurei usar a classe .net GZipStream (ou DeflateStream). No entanto, descobri que a descompressão nem sempre foi bem-sucedida, às vezes as imagens descomprimiam muito bem e outras vezes eu recebia um erro GDI + de que algo está corrompido.

Depois de investigar o problema, descobri que a descompressão não estava devolvendo todos os bytes compactados. Portanto, se eu comprimisse 2257974 bytes, às vezes recuperaria apenas 2257870 bytes (números reais).

O mais engraçado é que às vezes funcionava. Então, eu criei esse pequeno método de teste que comprime apenas 10 bytes e agora não recebo nada.

Eu tentei com as duas classes de compressão GZipStream e DeflateStream e verifiquei meu código em busca de possíveis erros. Eu até tentei posicionar o fluxo em 0 e liberar todos os fluxos, mas sem sorte.

Aqui está o meu código:

    public static void TestCompression()
    {
        byte[] test = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

        byte[] result = Decompress(Compress(test));

        // This will fail, result.Length is 0
        Debug.Assert(result.Length == test.Length);
    }

    public static byte[] Compress(byte[] data)
    {
        var compressedStream = new MemoryStream();
        var zipStream = new GZipStream(compressedStream, CompressionMode.Compress);
        zipStream.Write(data, 0, data.Length);
        return compressedStream.ToArray();
    }

    public static byte[] Decompress(byte[] data)
    {
        var compressedStream = new MemoryStream(data);
        var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
        var resultStream = new MemoryStream();

        var buffer = new byte[4096];
        int read;

        while ((read = zipStream.Read(buffer, 0, buffer.Length)) > 0) {
            resultStream.Write(buffer, 0, read);
        }

        return resultStream.ToArray();
    }

questionAnswers(2)

yourAnswerToTheQuestion