检查DEFLATED数据的有效性

时间:2012-07-02 15:35:25

标签: .net inflate deflate

我有一些通过DEFLATE算法传递的数据。如果我运行命令perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < deflated_data.gz则打印正确的输出。但是,如果我在同一数据上使用以下代码,则在尝试扩充数据时会收到InvalidDataException。是否有任何INFLATE实现会告诉我数据不正确的位置?

    public byte[] Inflate(byte[] inputData)
    {
        using (Stream input = new DeflateStream(new MemoryStream(inputData),
                                                CompressionMode.Decompress))
        {
            using (MemoryStream output = new MemoryStream())
            {
                input.CopyTo(output);
                return output.ToArray();
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

这不是兼容性问题,而是您的格式理解问题。这里提到了三种格式:deflate(原始压缩数据),zlib(包装在zlib头和尾部中的deflate数据)和gzip(包装在gzip头和尾部中的deflate数据)。它们分别记录在RFC 1951RFC 1950RFC 1952中。

Compress :: Zlib uncompress()函数是properly documented,并指出uncompress()期望zlib(RFC 1950)流。 .NET DeflateStream类也是properly documented,并期待一个原始的deflate流(RFC 1951)。

当你说“有一些数据通过DEFLATE算法传递”时,你真正的意思是你已经压缩为zlib(RFC 1950)格式,而不是deflate格式。