2010-07-12 28 views
3

Je regardais juste un échantillon de code pour compresser une chaîne. Je trouve que l'utilisation de la classe GZipStream suffit. Mais je ne comprends pas pourquoi nous devons le convertir en base 64 comme montré dans l'exemple.GZipStream: pourquoi nous convertissons en base 64 après compression?

using System.IO.Compression; 
using System.Text; 
using System.IO; 

public static string Compress(string text) 
{ 
byte[] buffer = Encoding.UTF8.GetBytes(text); 
MemoryStream ms = new MemoryStream(); 
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) 
{ 
zip.Write(buffer, 0, buffer.Length); 
} 

ms.Position = 0; 
MemoryStream outStream = new MemoryStream(); 

byte[] compressed = new byte[ms.Length]; 
ms.Read(compressed, 0, compressed.Length); 

byte[] gzBuffer = new byte[compressed.Length + 4]; 
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length); 
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4); 
return Convert.ToBase64String (gzBuffer); 
} 

De plus, je ne comprends pas mon gzBuffer l'est initialisé à une taille compressed.Length + 4. En fait, je ne comprends pas pourquoi nous avons les dernières déclarations non plus. Quelqu'un peut-il partager un peu de lumière ...

PS: Je ne suis pas un étudiant en informatique.

Répondre

3

Probablement la chaîne de base 64 est telle qu'elle peut être visualisée en texte brut, par exemple pour l'impression, y compris dans un e-mail ou quelque chose comme ça. Modifier: Maintenant, je vois le source, ils disent qu'ils veulent l'insérer dans un fichier XML, c'est pourquoi ils devaient être en texte brut. La taille compressed.Length + 4 est requise en raison de la ligne suivante - BlockCopy. Il commence à copier à partir de 4 octets dans le gzBuffer. (Le quatrième argument est le décalage d'octet dans le tampon de destination). Le second BlockCopy place la longueur de la chaîne compressée dans les quatre premiers octets du tampon de destination. Je ne suis pas sûr pourquoi il aurait besoin de la longueur ici, mais il peut bien y avoir une routine de décodage correspondant, il doit s'aligner avec.

Modifier: La longueur est utilisée dans le sous-programme de décompression afin que le programme sache combien de temps le tampon d'octets décompressé doit être.

+0

afin que la conversion n'affecte pas la taille de la sortie? Et à propos de la routine de décodage - oui, il y en a une! quel est le but de stocker la longueur dans les 4 octets? Est-ce un nécessaire? Ps; Le code provient de [ici] (http://www.csharphelp.com/2007/09/compress-and-decompress-strings-in-c/). – deostroll