2009-04-26 16 views
1

これらのメソッドのセットで何が問題になることがありますか?.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); 

gzipStrは有効なGzippedストリームです(GzipStream()圧縮で正常に圧縮できます)。

なぜtotal_readは常に0ですか?ストリームを解凍するgzipストリームですか?私は何か間違っているのですか?

私はここで間違っていますか?

答えて

2

あなたはフラッシュするのを忘れました。 :) Encoding.Defaultは、一般的に本番環境では使用しないでください。以下では、Encoding.UTF8(または適切なもの)で置き換えてください。最後に、もちろん、以下のsantiy-checkは、すべてが単一のバッファに収まる場合にのみ機能します。しかし今、あなたはその考えを得るべきです。

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

    } 
} 

それがコンパイルされています: GMCSは-d:デバッグ-langversion:LINQ -debug + GzipBugを

kementeusは、私が使用される正確なコードであるので、以下、ここで私の前のコードを示して助けにはなりませんでした。 CS とのように実行します。 MONO_TRACE_LISTENER = Console.Out GzipBug.exe

(あなたがMONO_TRACE_LISTENERビットを削除することができます)

+0

[OK]を、私はgzipのストリームをフラッシュしてあなたのポイントを持って、Encoding.Default/Encoding.UTF8を使用しています。 .. B私の問題はgzip圧縮とは決して関連しませんでしたが、それはうまくいきます... 私はあなたの修正を行いましたが、合計読み取り_stills_ 0 ですので、主な問題が続く。 – kementeus

+0

私はちょうど私が使っているコードを投稿しました。 Flushを取り出すと0になり、それを入れると12になります。私はEncoding.UTF8が副次的な問題であることに同意しますが、エンコードには常に注意する価値があります。 –

関連する問題