2009-04-26 5 views
1

Was könnte mit diesen Methoden falsch sein?Probleme mit .net Gzip Dekomprimierung Stream

 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); 

Die gzipStr ist ein gültiger GZip-Stream (ich es erfolgreich mit GZipStream komprimieren könnte() Compress).

Warum ist total_read immer 0 ??? entpackt gzip stream meinen Stream? mache ich etwas falsch?

Was mache ich hier falsch ?? !!!

Antwort

2

Sie haben vergessen zu spülen. :) Beachten Sie, dass Encoding.Default generell nicht in der Produktion verwendet werden sollte. Im Folgenden ersetzen Sie es mit Encoding.UTF8 (oder was auch immer). Schließlich funktioniert die untenstehende Überprüfung natürlich nur dann, wenn alles in einen einzigen Puffer passt. Aber jetzt sollten Sie die Idee bekommen.

kementeus angegeben meinem vorherigen Code hier nicht helfen, so unter der genauen Code I verwendet:

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); 

    } 
} 

Es wird zusammengestellt mit: gmcs -d: DEBUG -langversion: Linq debug + GzipBug. cs und so laufen: MONO_TRACE_LISTENER = Console.Out GzipBug.exe

(Sie können die MONO_TRACE_LISTENER Bit entfernen)

+0

Ok, ich habe Ihre Nummer mit gzip Strom Flush und verwenden Encoding.Default/Encoding.UTF8. .. B ut mein Problem wurde nie mit der Gzip-Komprimierung in Verbindung gebracht, es funktioniert gut ... Ich habe Ihre Änderungen aber insgesamt lesen _stills_ 0 So bleibt das Hauptproblem – kementeus

+0

Ich habe gerade den genauen Code geschrieben, den ich benutze. Wenn Sie den Flush herausnehmen, gibt es 0, wenn Sie ihn einfügen, gibt es 12. Ich stimme dem Encoding.UTF8 ist ein Nebenproblem, aber es lohnt sich immer auf die Codierung zu achten. –

Verwandte Themen