2010-10-22 22 views
-5

pourquoi je ne peux pas obtenir ce code ici pour travailler? Je veux appeler cela sur un tableau d'octets qui a été compressé en .... De toute façon, il retourne juste une chaîne vide ...C# décompression gzipstream est plus comme la dépression

public static string FromGZipToString(this byte[] source) 
    { 
     using(MemoryStream stream = new MemoryStream()) 
     { 
      stream.Write(source, 0, source.Length); 

      using (var gzipstream = new GZipStream(stream, CompressionMode.Decompress)) 
      using (var reader = new StreamReader(gzipstream)) 
      { 
       return reader.ReadToEnd(); 
      } 
     } 
    } 

est ici le code compressif par la façon ....

public static byte[] ToGZip(this string source) 
    { 
     using(var stream = new MemoryStream()) 
     using(var compressor = new GZipStream(stream, CompressionMode.Compress)) 
     { 
      var bytes = System.Text.UTF8Encoding.UTF8.GetBytes(source); 

      compressor.Write(bytes, 0, bytes.Length); 

      return stream.ToArray(); 
     } 
    } 
+6

Vous avez oublié de réinitialiser la position du MemoryStream? – BrokenGlass

+0

réinitialiser la position après l'écriture ne le fixe pas = ( – Timmerz

+0

Missing a Flush n'importe où? – spender

Répondre

5

Votre routine de compression est défectueuse. Il ne doit pas être lu à partir du flux tant que le compresseur n'a pas été fermé (ou éliminé), ce qui permet au compresseur de finir d'écrire tous les octets dans la vapeur.

Vérifiez ma réponse à cette question: compressing and decompressing source data gives result different than source data

+0

il semble être une combinaison de cela avec ajouter stream.Seek (0, SeekOrigin.Begin); après l'écriture dans la décompression – Timmerz

+0

Probablement mieux répondu en disant: vous devez rincer votre compresseur avant de lire le MemoryStream – spender

+0

non, flush ne fonctionne pas ... – Timmerz