Necesitaba una forma de comprimir imágenes en .net, así que investigué usando la clase .net GZipStream (o DeflateStream). Sin embargo, descubrí que la descompresión no siempre era exitosa, a veces las imágenes se descomprimían bien y otras veces obtenía un error GDI + de que algo estaba dañado.GZipStream y DeflateStream no descomprimirán todos los bytes
Después de investigar el problema, encontré que la descompresión no devolvía todos los bytes que comprimía. Entonces, si comprimía 2257974 bytes, a veces obtengo solo 2257870 bytes (números reales).
Lo más divertido es que a veces funcionaría. Así que creé este pequeño método de prueba que comprime solo 10 bytes y ahora no recupero nada.
Lo probé con las dos clases de compresión GZipStream y DeflateStream y revisé mi código para ver si había posibles errores. Incluso intenté posicionar la transmisión en 0 y lavar todas las transmisiones, pero sin suerte.
Aquí está mi 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();
}
Re su comentario - se reduce a los almacenamientos intermedios en diferentes niveles; si no están todos vacíos (en el orden correcto), entonces no se obtienen todos los datos. –
Tenga en cuenta, por ejemplo, que no me molesté en llamar a Close() en el mismo MemoryStream, así que estoy parcialmente de acuerdo ;-p –
Agregaré una actualización sobre esto, también ... –