2009-04-26 2 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이

+0

확인을 (당신이 MONO_TRACE_LISTENER 비트를 제거 할 수 있습니다) 년은 세척 gzip을 스트림을 사용하여 포인트를 얻고 Encoding.Default/Encoding.UTF8를 사용합니다. .. B 유감스럽게도 내 문제는 gzip 압축과 관련이 없었습니다 ... 수정했지만 총 _stills_ 0을 읽었습니다. 따라서 주요 문제가 계속 발생합니다. – kementeus

+0

방금 ​​사용하고있는 정확한 코드를 게시했습니다. Flush를 꺼내면 0이되고, 넣으면 12가됩니다. Encoding.UTF8은 측면 문제이지만 인코딩에 항상주의를 기울일 필요가 있습니다. –