J'avais besoin d'un moyen de compresser des images en .net et j'ai donc cherché à utiliser la classe .net GZipStream (ou DeflateStream). Cependant, j'ai constaté que la décompression n'était pas toujours réussie, parfois les images se décompressaient bien et d'autres fois j'obtenais une erreur GDI+ indiquant que quelque chose était corrompu.
Après avoir étudié le problème, j'ai constaté que la décompression ne restituait pas tous les octets qu'elle avait compressés. Ainsi, si je compressais 2257974 octets, je ne récupérais parfois que 2257870 octets (chiffres réels).
Le plus drôle, c'est que parfois cela fonctionnait. J'ai donc créé cette petite méthode de test qui ne compresse que 10 octets et maintenant je ne récupère plus rien du tout.
J'ai essayé avec les deux classes de compression GZipStream et DeflateStream et j'ai vérifié mon code pour détecter d'éventuelles erreurs. J'ai même essayé de positionner le flux à 0 et de vider tous les flux, mais sans succès.
Voici mon code :
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();
}