2011-06-01 40 views
3

(PCAP)無法從一些數據包的解壓縮ZLIB/DEFLATE我試圖從從網絡捕獲的文件壓縮字節的數據數據

數據沒有ZLIB頭(第2個字節,其中第一個字節的低4位始終爲8),因此當我試圖使用ZlibStream進行解壓縮時出現異常。帶有標題的數據似乎工作正常。

據我所知,ZLIB只是DEFLATE的頁眉和頁腳,我將這些數據無標題地傳遞給DeflateStream。這一次DeflateStream不會拋出任何錯誤,它只是給出了錯誤的數據(但它給出了正確的長度)...

這是一個示例數據。 C#代碼示例使用DotNetZip:

byte[] test3 = new byte[] { 0x1a, 0x6d, 0xf, 0x8d, 0xb6, 0x87, 0x46, 0xdb, 0x43, 0xa3, 0xed, 0xa1, 0xd1, 
       0xf6, 0xd0, 0x68, 0x7b, 0x68, 0xb4, 0x3d, 0x34, 0xda, 0x1e, 0xb2, 0x44, 0x3a, 0x39, 0x6f, 0x24, 
       0xae, 0x1f, 0x2, 0x0, 0x0, 0x0, 0xff, 0xff }; 


static void UncompressData(byte[] data) 
{ 
    if ((data[0] & 0x0F) != 0x08) 
    {   
     var uncompressed = DeflateStream.UncompressBuffer(data); 
     Console.WriteLine("Uncompressed Deflate data : {0} => {1} bytes", data.Length, uncompressed.Length); 
    } 
    else 
    { 
     var uncompressed = ZlibStream.UncompressBuffer(data); 
     Console.WriteLine("Uncompressed ZLIB data : {0} => {1} bytes", data.Length, uncompressed.Length); 
    } 
} 

我的System.IO.Compression.DeflateStreamIonic.Zlib.DeflateStream(從DotNetZip)C#以及Java的java.util.zip.Inflater測試。所有給出了類似的陣列充滿0 ..

任何想法在這裏可能會失蹤? ZLIB/DEFLATE可能是有狀態的,並且解壓縮需要來自所有先前數據包的數據?

謝謝。

回答

2

是的,你需要整個「文件」,你不能單獨壓縮單個數據包。

從zlib文檔中,可以從文件中的各個點開始放氣。但是,您需要完全控制拼圖的壓縮一半,因爲您必須確切知道這些點在哪裏以便從那裏開始放氣。他們仍然(可能)不會打破「包」的界限。

+0

感謝您的支持。現在,我的同事似乎能夠使用Java從它提取數據,但它需要閱讀前面提到的所有數據包。 – Gant 2011-06-04 08:11:03