Bonjour à tous,

Je manipule des fichier XML dans mon application. Pour les stocker en base je les converti en base 64 puis je les compresse. Voici ma fonction qui me permet de faire l'opération inverse (décompression puis décode base 64):

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
 
// Convert byte[] to MemoryStream, xCblBodyB64GZip (byte[]) contient
 ce qui est stocké en base
MemoryStream xCblBodyB64GZipMemoryStream = new MemoryStream
(xCblBodyB64GZip);
 
GZipStream xCblBodyB64GzipStream = new GZipStream
 (xCblBodyB64GZipMemoryStream, CompressionMode.Decompress);
// Uncompress GZipStream in byte[1024] and store them in MemoryStream
MemoryStream xCblBodyB64MemoryStream = new MemoryStream ();
byte[] buffer = new byte[1024];
int readBytes;
// On lit des paquets de 1024 bytes dans buffer puis on les mets les uns à
 la suite des autres dans un MemoryStream.
while ((readBytes = xCblBodyB64GzipStream.Read (buffer, 0,
 buffer.Length)) > 0)
    xCblBodyB64MemoryStream.Write (buffer, 0, readBytes);
xCblBodyB64MemoryStream.Position = 0;
 
// Convert from MemoryStream to byte[]
byte[] xCblBodyB64BytesArray = new byte[xCblBodyB64MemoryStream.Length];
xCblBodyB64MemoryStream.Read (xCblBodyB64BytesArray, 0,
 xCblBodyB64BytesArray.Length);
 
// Convert byte[] to base 64
string xCblBodyB64 = System.Text.Encoding.UTF8.GetString
 (xCblBodyB64BytesArray);
 
// Convert base 64 to byte[]
byte[] xCblBodyBytesArray = Convert.FromBase64String (xCblBodyB64);
 
// Convert from byte[] to string
xCblBody = System.Text.Encoding.UTF8.GetString (xCblBodyBytesArray);
Jusqu'à la boucle, tout se passe bien. La chaine compressée est bien la même que celle que j'ai obtenu avant de l'enregistrer en base.
La boucle lit des paquets de 1024 bytes et les enregistre dans un memory stream. Le résultat de la décompression est bien identique à ce que j'avais avant compression SAUF le dernier byte qui a disparu ...
readBytes me donne une unité de moins que ce qu'il devrait et le tableau buffer ne contient pas le dernier byte attendu.

Avez-vous une idée?

Merci d'avance