2008-10-09 54 views
4

我正在使用zlib.NET庫來嘗試對zlib壓縮的文件進行壓縮(可能在Linux機器上)。下面是我在做什麼:如何用zlib.NET膨脹文件?

zlib.ZInputStream zinput = 
    new zlib.ZInputStream(File.Open(path, FileMode.Open, FileAccess.Read)); 

while (stopByte != (data = zinput.ReadByte())) 
{ 
    // check data here 
} 

zinput.Close(); 

的數據字節匹配的壓縮數據字節,所以我必須做一些錯誤的。

+1

要處理的gzip/zlib的/放氣的壓縮文件,即使壓縮數據文件的開始中,我發現了[offzip](http://aluigi.altervista.org/mytoolz.htm# offzip)工具[在reverseengineering.se上提到](https://reverseengineering.stackexchange.com/questions/1463/are-there-any-tools-or-scripts-for-identifying-compression-algorithms-in-executa)有用。它會查找並提取壓縮的流,而不管它們在文件中的起始位置。使用正確的命令行參數,如果它是一個沒有標題的純壓縮流標記它。 – CodesInChaos 2015-12-07 16:32:53

回答

7

看來我犯了一個錯誤,認爲所有的虛擬方法都被覆蓋了,而事實並非如此。我正在使用zlib.ZInputStream.ReadByte(),它只是繼承的Stream.ReadByte(),它不會做任何膨脹。

我用zlib.ZInputStream.Read()代替它,它的工作方式應該如此。

+3

這聽起來像Stream的糟糕實現,因爲基本的ReadByte()會調用Read()來讀取一個字節。 – 2010-08-27 12:28:53

+1

是的 - 實際上,它不重寫`Read`,而是實現`read`。它也覆蓋BinaryReader,而不是Stream,這很愚蠢。後來我轉而使用DotNetZip庫的`Ionic.Zlib`命名空間,它具有適當的基於`Stream`的實現。 zlib.NET只是不適合生產使用,而且實際上只是付費產品的一個挑逗。 – 2010-08-27 14:46:58

+2

只是碰到同樣的問題。對zlib.NET沒有那麼深刻的印象!爲什麼`ZInputStream`不會覆蓋`Stream`?相反,它會覆蓋`BinaryReader`,並不完全在那!我不喜歡這裏的所有解決方案似乎都建議將泄漏流複製到內存中。我會按照你的建議嘗試Ionic.ZLib。謝謝。 – 2013-07-22 03:36:15

7

除了在面對異常時未能使用「using」語句來關閉數據流之外,對我來說這看起來沒問題。數據是否被絕對壓縮?你能用linux上的zlib解壓縮它嗎?

看了看源代碼,它非常可怕 - 例如,撥打int Read(buffer, offset, length)最終會調用其內部int Read()方法length次。考慮到這種不穩定的開局,我不確定我是否會特別重視代碼,但我預計它至少會在的範圍內工作!您是否嘗試過使用SharpZipLib

+1

我不認爲SharpZipLib是zlib,但是DotNetZip可以:http://dotnetzip.codeplex.com/ – 2011-03-24 02:32:45

0

仔細查看示例代碼,它將數據從常規文件流複製到ZOutputStream。解壓必須通過該層進行。

private void decompressFile(string inFile, string outFile) 
{ 
    System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); 
    zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream); 
    System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);   
    try 
    { 
     CopyStream(inFileStream, outZStream); 
    } 
    finally 
    { 
     outZStream.Close(); 
     outFileStream.Close(); 
     inFileStream.Close(); 
    } 
} 
+0

你可以在輸入或輸出上進行壓縮/解壓縮。 ZInputStream絕對有能力進行壓縮或解壓縮。 – 2008-10-09 05:20:46

2

下面的代碼可以幫助你們。實例化對象並使用這些函數。

public class FileCompressionUtility 
{ 
    public FileCompressionUtility() 
    { 
    } 

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output) 
    { 
     byte[] buffer = new byte[2000]; 
     int len; 
     while ((len = input.Read(buffer, 0, 2000)) > 0) 
     { 
      output.Write(buffer, 0, len); 
     } 
     output.Flush(); 
    } 

    public void compressFile(string inFile, string outFile) 
    { 
     System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); 
     zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream, zlib.zlibConst.Z_DEFAULT_COMPRESSION); 
     System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open); 
     try 
     { 
      CopyStream(inFileStream, outZStream); 
     } 
     finally 
     { 
      outZStream.Close(); 
      outFileStream.Close(); 
      inFileStream.Close(); 
     } 
    } 

    public void uncompressFile(string inFile, string outFile) 
    { 
     int data = 0; 
     int stopByte = -1; 
     System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); 
     zlib.ZInputStream inZStream = new zlib.ZInputStream(System.IO.File.Open(inFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)); 
     while (stopByte != (data = inZStream.Read())) 
     { 
      byte _dataByte = (byte)data; 
      outFileStream.WriteByte(_dataByte); 
     } 

     inZStream.Close(); 
     outFileStream.Close(); 
    } 
} 
0

最近我服完使用PHP的各種瀏覽器和平臺,包括IE7以前zlib'd文檔的不幸。一旦我想通了,該文檔被zlib'd而不是gzip壓縮(在當時被認爲)我在.NET框架v4的使用方式如下SharpZipLib(服用Stream.CopyTo優勢):

public static byte[] DecompressZlib(Stream source) 
{ 
    byte[] result = null; 
    using (MemoryStream outStream = new MemoryStream()) 
    { 
     using (InflaterInputStream inf = new InflaterInputStream(source)) 
     { 
      inf.CopyTo(outStream); 
     } 
     result = outStream.ToArray(); 
    } 
    return result; 
} 

以爲我會把它放在這裏,以防任何人需要幫助從SharpZipLib使用類。

3

跳過zlib頭(前兩個字節,78 9C),然後使用內置到.net中的DeflateStream爲我工作。

using(var input = File.OpenRead(...)) 
using(var output = File.Create(...)) 
{ 
    // if there are additional headers before the zlib header, you can skip them: 
    // input.Seek(xxx, SeekOrigin.Current); 

    if (input.ReadByte() != 0x78 || input.ReadByte() != 0x9C)//zlib header 
     throw new Exception("Incorrect zlib header"); 

    using (var deflateStream = new DeflateStream(decryptedData, CompressionMode.Decompress, true)) 
    { 
     deflateStream.CopyTo(output); 
    } 
}