Bonjour à tous,

Savez vous pourquoi le (minuscule) bout de code suivant ne fonctionne pas?

Explications:

J'ai une string toute bête ("abcdef....."), je la copie dans originalBody pour pouvoir comparer après traitement

Je la compresse et la décompresse (la plupart du code sert à convertir le string en byte[], en streams etc...)

La ligne qui est supposée décompressée le string retourne 0 et n'écrit rien dans le MemoryStream concernée, comme si il n'y avait rien à décompresser.

Pourtant si j'appelle la même méthode gzipStream.Read (buffer, 0, buffer.Length) une fois avant la boucle de décompression normale (ie: je décommente la ligne dans le code ci-dessous), elle retourne toujours 0 au premier appel mais lors de l'appelle à la ligne du while(), elle décompresse une partie de la chaine de départ dans le MemoryStream (le buffer étant nettement plus grand que le nombre de byte décompressé)..... En changeant la chaine de départ, il manque plus ou moins de caractères.... C'est très bizarre...

Difficile de faire un code plus simple pour trouver d'où peut venir l'erreur... Tous les exemples que je trouve fonctionnent bien mais compressent / décompressent des fichiers... Là j'ai besoin de travailler sur des string...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
 
namespace CompressAndDecompress {
    class Program {
        static string body;
        static string originalBody;
        static byte[] bodyGZip;
 
        static void Main (string[] args) {
            body = "abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz";
            originalBody = body;
 
            Compress ();
            Decompress ();
 
            if (originalBody != body)
                Console.WriteLine ("Marche po...");
            else
                Console.WriteLine ("Marche");
            Console.ReadKey ();
        }
 
        static void Compress () {
            byte[] bodyBytesArray = Encoding.Unicode.GetBytes (body);
            MemoryStream bodyGzipMemoryStream = new MemoryStream ();
            GZipStream gzipStream = new GZipStream (bodyGzipMemoryStream, CompressionMode.Compress);
            gzipStream.Write (bodyBytesArray, 0, bodyBytesArray.Length);
            bodyGzipMemoryStream.Position = 0;
            bodyGZip = new byte[bodyGzipMemoryStream.Length];
            bodyGzipMemoryStream.Read (bodyGZip, 0, bodyGZip.Length);
        }
 
        static void Decompress () {
            MemoryStream bodyGzipMemoryStream = new MemoryStream (bodyGZip);
            GZipStream gzipStream = new GZipStream (bodyGzipMemoryStream, CompressionMode.Decompress, true);
            MemoryStream bodyMemoryStream = new MemoryStream ();
            byte[] buffer = new byte[1024];
            int readBytes;
            // gzipStream.Read (buffer, 0, buffer.Length);
            while ((readBytes = gzipStream.Read (buffer, 0, buffer.Length)) != 0)
                bodyMemoryStream.Write (buffer, 0, readBytes);
 
            bodyMemoryStream.Position = 0;
            byte[] bodyBytesArray = new byte[bodyMemoryStream.Length];
            bodyMemoryStream.Read (bodyBytesArray, 0, bodyBytesArray.Length);
            body = Encoding.Unicode.GetString (bodyBytesArray);
        }
    }
}
Si vous avez des pistes de reflexion, des idées ou LA solution, je vous en serait hyper reconnaissant parce que je ne sais plus ou chercher...

Merci d'avance