【问题标题】:Cannot decompress ZLIB/DEFLATE data无法解压缩 ZLIB/DEFLATE 数据
【发布时间】:2011-09-06 05:20:22
【问题描述】:

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

其中一些数据包的数据没有 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);
    }
}

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

知道这里可能缺少什么吗? ZLIB/DEFLATE 是否有可能是有状态的,并且所有先前数据包中的解压缩所需的数据?

谢谢。

【问题讨论】:

    标签: c# compression zlib deflate dotnetzip


    【解决方案1】:

    是的,您需要整个“文件”,您不能孤立地对单个数据包进行放气。

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

    【讨论】:

    • 谢谢。现在我的同事似乎能够使用 Java 从中提取数据,但它需要读取您提到的所有先前的数据包。
    猜你喜欢
    • 2017-11-08
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多