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