无法解压缩ZLIB / DEFLATE数据

我正在尝试从网络捕获文件(PCAP)中提取压缩字节数据。

来自其中一些数据包的数据没有ZLIB标头(前2个字节,其中第一个字节的低4位始终为8),因此当我尝试使用ZlibStream进行解压缩时会出现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); } } 

我使用C#的System.IO.Compression.DeflateStreamIonic.Zlib.DeflateStream (来自DotNetZip )和Java的java.util.zip.Inflater 。 所有给出类似的数组充满0 ..

对这里可能缺少什么的想法? 有可能ZLIB / DEFLATE是有状态的,并且解压缩需要来自所有先前数据包的数据吗?

谢谢。

是的,您需要整个“文件”,您无法隔离单个数据包。

从zlib文档中,可以从文件中的各个点开始收缩。 但是,您需要完全控制拼图的压缩部分,因为您必须确切知道这些点的位置才能从那里开始缩小。 他们仍然(可能)不会打破“数据包”边界。