2011-07-06 60 views
0

原始的壓縮數據可以被正確地填充回來。然而,如果我膨脹數據,放氣,並再次膨脹,結果數據是不正確的(例如,簡單的數據提取,其修改和再次壓縮 - 只有當現在測試沒有修改發生時,所以我可以測試它)。SharpZipLib Deflater創建錯誤的數據

生成的數據以某種方式「損壞」。起始(大約)40個字節是正確的,然後是「不正確」數據的「塊」(原始數據殘留仍然存在,但許多字節丟失)。

更改壓縮級別沒有幫助(除了設置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,沒有損壞或奇怪的字節順序的文件。