2011-07-06 3 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、無破損または奇妙なバイトオーダーファイルが。

関連する問題