0

我有一些通过 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();
            }
        }
    }
4

1 回答 1

3

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

Compress::Zlib uncompress() 函数已正确记录并声明 uncompress() 需要一个 zlib (RFC 1950) 流。.NET DeflateStream 类也有正确的文档记录,并且需要一个原始的 deflate 流(RFC 1951)。

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

于 2012-07-02T17:46:05.887 回答