无法解压ZLIB/DEFLATE数据

3
我正在尝试从网络捕获文件(PCAP)的压缩字节中提取数据。其中一些数据包的数据没有ZLIB头(前两个字节,第一个字节的低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);
    }
}

我使用了C#的System.IO.Compression.DeflateStreamIonic.Zlib.DeflateStream(来自DotNetZip),以及Java的java.util.zip.Inflater进行了测试。它们都返回了类似的由0填充的数组... 有什么想法吗?ZLIB/DEFLATE是否具有状态性质,需要从所有先前的数据包中获取解压缩所需的数据?谢谢。
1个回答

2

是的,你需要整个“文件”,不能单独压缩包进行压缩。

根据zlib文档,可以从文件中的各个点开始压缩。但是,你需要完全掌握压缩过程,因为你必须知道在哪些点上开始压缩。此外,它们仍然(可能)无法在“数据包”边界上断开。


谢谢这个。现在我的同事似乎能够使用Java从中提取数据,但正如你所提到的,它需要阅读所有先前的数据包。 - Gant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接