2011-07-06 2 views
0

원본 압축 데이터를 올바르게 다시 팽창시킬 수 있습니다. 그러나 데이터를 팽창시키고 수축 시키며 다시 팽창 시키면 결과 데이터가 부정확합니다 (예 : 간단한 데이터 추출, 수정 및 다시 압축 - 수정이 테스트되지 않았을 때만 테스트 할 수 있음).SharpZipLib Deflater가 잘못된 데이터를 생성합니다.

결과 데이터가 어떻게 든 손상됩니다. 시작 (약) 40 바이트는 OK이고 잘못된 데이터의 "블록"이 이어집니다 (원래 데이터의 나머지는 여전히 있지만 많은 바이트가 누락되었습니다).

압축 수준을 변경해도 도움이되지 않습니다 (NO_COMPRESSION을 설정하면 불완전한 스트림이 생성됨).

질문은 간단합니다. 왜 그런 일이 발생합니까?

using ICSharpCode.SharpZipLib.Zip.Compression; 

public byte[] Inflate(byte[] inputData) 
{ 
    Inflater inflater = new Inflater(false); 
    using (var inputStream = new MemoryStream(inputData)) 
    using (var ms = new MemoryStream()) 
    { 
     var inputBuffer = new byte[4096]; 
     var outputBuffer = new byte[4096]; 

     while (inputStream.Position < inputData.Length) 
     { 
      var read = inputStream.Read(inputBuffer, 0, inputBuffer.Length); 

      inflater.SetInput(inputBuffer, 0, read); 

      while (inflater.IsNeedingInput == false) 
      { 
       var written = inflater.Inflate(outputBuffer, 0, outputBuffer.Length); 

       if (written == 0) 
        break; 

       ms.Write(outputBuffer, 0, written); 
      } 

      if (inflater.IsFinished == true) 
       break; 
     } 

     inflater.Reset(); 

     return ms.ToArray(); 
    } 
} 

public byte[] Deflate(byte[] inputData) 
{ 
    Deflater deflater = new Deflater(Deflater.BEST_SPEED, false); 
    deflater.SetInput(inputData); 
    deflater.Finish(); 

    using (var ms = new MemoryStream()) 
    { 
     var outputBuffer = new byte[65536 * 4]; 
     while (deflater.IsNeedingInput == false) 
     { 
      var read = deflater.Deflate(outputBuffer); 
      ms.Write(outputBuffer, 0, read); 

      if (deflater.IsFinished == true) 
       break; 
     } 

     deflater.Reset(); 

     return ms.ToArray(); 
    } 
} 

편집 : 잘못하여 원래 압축 된 데이터의 처음 몇 바이트를 다시 작성했습니다. 이것은 SharpZipLib 오류가 아니지만 내 것입니다.

답변

1

나는이 접선 대답은 알고 있지만, 정확한 같은 일이 내게 일어난 나는 SharpZipLib을 포기하고 DotNetZip에 갔다 :

http://dotnetzip.codeplex.com/

쉬운 API, 아니 손상되었거나 이상한 바이트 순서 파일.

관련 문제