2009-04-26 3 views
1

Quel pourrait être le problème avec ces méthodes?Problèmes avec le flux de décompression .net gzip

 byte[] bytes; 

     using (var memory_stream = new MemoryStream()) 
     using (var gzip_stream = new GZipStream(memory_stream, CompressionMode.Compress)) 
     { 
      var buffer = Encoding.Default.GetBytes("Hello nurse!"); 
      gzip_stream.Write(buffer, 0, buffer.Length); 
      bytes = memory_stream.ToArray(); 
     } 

     int total_read = 0; 

     using (var input_stream = new MemoryStream(bytes)) 
     using (var gzip_stream = new GZipStream(input_stream, CompressionMode.Decompress, true)) 
     { 
      int read; 
      var buffer = new byte[4096]; 
      while ((read = gzip_stream.Read(buffer, 0, buffer.Length)) != 0) { 
       total_read += read; 
      } 
     } 

     Debug.WriteLine(bytes); 
     Debug.WriteLine(total_read); 

Le gzipStr est valide gzippée flux (je pouvais compresser avec succès GZipStream() Compress).

Pourquoi total_read est toujours 0 ??? est-ce que le flux gzip décompresse mon flux? Est-ce que je fais quelque chose de mal?

Qu'est-ce que je fais mal ici ??? !!!

Répondre

2

Vous avez oublié de rincer. :) Notez que Encoding.Default ne doit généralement pas être utilisé en production. Dans ce qui suit, remplacez-le par Encoding.UTF8 (ou ce qui est approprié). Enfin, bien sûr, la vérification de santiy ci-dessous ne fonctionne que si tout est dans un seul tampon. Mais maintenant vous devriez avoir l'idée.

kementeus indiqué mon code précédent ici n'a pas aidé, donc ci-dessous est le code exact je:

public class GzipBug 
{ 
    public static void Main(String[] a) 
    { 
     byte[] bytes; 
    byte[] buffer; 

    Encoding encoding = Encoding.UTF8; 

     using (var memory_stream = new MemoryStream()) 
     using (var gzip_stream = new GZipStream(memory_stream, CompressionMode.Compress)) 
     { 
      buffer = encoding.GetBytes("Hello nurse!"); 
      gzip_stream.Write(buffer, 0, buffer.Length); 
     gzip_stream.Flush(); 
     bytes = memory_stream.ToArray(); 
     } 

     int total_read = 0; 

     using (var input_stream = new MemoryStream(bytes)) 
     using (var gzip_stream = new GZipStream(input_stream, CompressionMode.Decompress, true)) 
     { 
     int read; 
      buffer = new byte[4096]; 
      while ((read = gzip_stream.Read(buffer, 0, buffer.Length)) != 0) { 
     total_read += read; 
      } 
     } 

     Debug.WriteLine(encoding.GetString(buffer, 0, total_read)); 
     Debug.WriteLine(total_read); 

    } 
} 

Il est compilé avec: gmcs -d: DEBUG -langversion: LINQ debug + GzipBug. cs et exécuté comme: MONO_TRACE_LISTENER = Console.Out GzipBug.exe

(vous pouvez supprimer le bit MONO_TRACE_LISTENER)

+0

Ok, je suis arrivé avec votre point flux gzip et Flush utiliser Encoding.Default/Encoding.UTF8. .. B Mon problème n'a jamais été lié à la compression gzip, ça marche bien ... J'ai fait vos modifications mais j'ai lu _stills_ 0 Donc le problème principal persiste – kementeus

+0

Je viens de poster le code exact que j'utilise. Si vous enlevez le Flush, il donne 0, si vous le mettez, il donne 12. Je suis d'accord sur le fait que Encoding.UTF8 est un problème secondaire, mais il vaut toujours la peine d'être attentif à l'encodage. –

Questions connexes