2014-04-28 2 views
1

ICSharpCode.SharpZipLib을 사용하여 웹에서 파일의 압축을 풀고 압축을 풀려면 압축되지 않은 바이트 배열을 가져와야합니다. 그러나 "InvalidOperationException :이 스트림에서 읽을 수 없습니다"오류가 발생합니다. 저는 C#에서 Unity3D에서 웹 플레이어로 대상을 사용하고 있습니다. 분명히 읽을 수 있기 때문에 문제가 확실하지 않습니다. 여기 내 코드와 모든 도움을 많이 주시면 감사하겠습니다.C# SharpZipLib Unity3D에서 압축을 풀려고 할 때 스트림을 읽을 수 없습니다.

using (MemoryStream s = new MemoryStream(bytes)) 
{ 
    using (BinaryReader br = new BinaryReader(s)) 
    {    

     using (ICSharpCode.SharpZipLib.Zip.ZipInputStream zip = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(s)) 
     { 
      byte[] bytesUncompressed = new byte[32768]; 
      while (true) 
      { 
       Debug.Log("can read: " + zip.CanRead); 
       int read = zip.Read(bytesUncompressed, 0, bytesUncompressed.Length); 
       if (read <= 0) 
        break; 
       zip.Write(bytesUncompressed, 0, read); 
      } 
     } 
    } 
} 
+0

여기에 왜 BinaryReader가 있습니까? 스트림을 버퍼링한다고 가정하면 스트림의 위치를 ​​예상치 못한 위치로 옮길 가능성이 큽니다. 따라서 손상되거나 유효하지 않은 압축이 나타납니다. – whoisj

+0

왜 같은 ZipInputStream을 읽고 쓰고 있습니까? 그게 가능한가? – whoisj

답변

0

당신이 당신의 스트림 s을 채우는 방법이 나에게 분명하지만, 당신이해야 할 수도 있습니다 모든 전에 그것을 읽고 다시 스트림의 위치를 ​​출시하는 것입니다

s.Seek(0, System.IO.SeekOrigin.Begin); 
0

예제 패턴은 매우 고통스러운 , 당신에게 "더 나은 (tm)"패턴을 사용하도록하겠습니다.

byte[] GetBytesFromCompressedStream(MemoryStream src) 
{ 
    byte[] uncompressedBytes = null; 

    using (MemoryStream dst = new MemoryStream()) 
    using (ICSharpCode.SharpZipLib.Zip.ZipInputStream zip = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(src)) 
    { 
     byte[] buffer = new byte[16 * 1024]; 
     int read = -1; 

     while((read = zip.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      dst.Write(buffer, 0, read); 
     } 

     uncompressedBytes = dst.ToArray(); 
    } 

    return uncompressedBytes; 
} 
+0

나는 이것을 시도했지만 여전히 .CanRead가 true를 리턴 함에도 불구하고 스트림에서 읽을 수 없다. – normower

+0

@normower 원본 스트림의 Length가 0보다 크다는 것은 긍정적입니까? Position whoisj