我有一些通过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();
}
}
}
答案 0 :(得分:3)
这不是兼容性问题,而是您的格式理解问题。这里提到了三种格式:deflate(原始压缩数据),zlib(包装在zlib头和尾部中的deflate数据)和gzip(包装在gzip头和尾部中的deflate数据)。它们分别记录在RFC 1951,RFC 1950和RFC 1952中。
Compress :: Zlib uncompress()函数是properly documented,并指出uncompress()期望zlib(RFC 1950)流。 .NET DeflateStream类也是properly documented,并期待一个原始的deflate流(RFC 1951)。
当你说“有一些数据通过DEFLATE算法传递”时,你真正的意思是你已经压缩为zlib(RFC 1950)格式,而不是deflate格式。