一个用于.net中的deflate,gzip和zlib的库

时间:2010-09-10 00:27:43

标签: .net compression gzip zlib deflate

首先,让我们定义一些常见的混淆词:

deflate = compression_algorithm;
zlib = header + deflate + trailer;
gzip = header + deflate + trailer;

我正在寻找一个基本上可以让我执行以下操作的库:

if(method == "gzip"){
    Response.Filter = new CompressionLibrary.OutputStream(Response.Filter, CompressionLibrary.Formats.GZIP);
}
else if(method == "deflate"){
    Response.Filter = new CompressionLibrary.OutputStream(Response.Filter, CompressionLibrary.Formats.DEFLATE);
}
else if(method == "zlib"){
    Response.Filter = new CompressionLibrary.OutputStream(Response.Filter, CompressionLibrary.Formats.ZLIB);
}

我正在寻找一种方法来比较测试在网络上使用的3种压缩格式。我希望每个格式的deflate压缩算法都是完全相同的实现。我已经在zlib.net上进行了攻击,强迫它给我原始的deflate命令(通过“未记录的功能”)...然而,添加gzip标题和预告片几乎没有超出我的联盟。

任何人都知道这样做的.net库吗?


澄清:

HTTP 1.1的 deflate 压缩格式实际上是 zlib 压缩格式。 Zlib是放气的包装物;它有一个2字节的标题和一个4字节的预告片,总是(当压缩方法和电平相同时)。

Gzip 在内部使用与zlib相同的压缩数据格式...这是deflate(raw deflate,而不是HTTP 1.1 deflate [zlib])。根据我自己的初步测试,gzip数据是zlib的12倍中的11个。

deflate 是一种用于压缩数据的压缩算法。当没有包装方法(例如,标题或预告片)围绕缩小的数据时,我称之为“收缩” - 或许我应该将其称为“raw deflate”

我正在对这些压缩方法及其在Web浏览器中的支持进行分析,并且需要对所有三种类型使用单个压缩方法。

2 个答案:

答案 0 :(得分:3)

基于我阅读标准文档和我使用zlib,.NET gzip和deflate实现以及.NET的其他几个压缩包所做的工作,我已经确定:

1)“raw deflate”总是小于你所谓的“HTTP 1.1 deflate”,它总是小于gzip。假设您使用相同的库来生成所有三个。也就是说,对于任何特定的压缩库,deflate< zlib< gzip的。

2)尺寸差异非常小。 deflate和zlib之间的区别通常只有几个字节。 deflate和gzip之间的差异最多只有几十个字节。无论文件大小如何,都是如此。

3)不同的deflate实现具有广泛变化的压缩比和执行时间。例如,zlib实现比.NET 3.5实现提供更好的压缩和更快的执行。

4)不同实现之间的互操作性几乎是100%。也就是说,由一个库创建的deflate(或gzip)文件可以由任何其他库解压缩。我听说过这种情况并非如此,但我无法构建一个。

5)由于CRC计算,创建gzip所需的时间比zlib要长得多。

我不知道有一个C#库允许你在给定原始deflate数据的情况下生成zlib或gzip文件,但是如果你研究标准文档,你应该能够相当容易地构建它们。

我也不知道任何支持“raw deflate”的浏览器。但是,我不能说我实际上已经尝试过了。我一直使用“HTTP 1.1 deflate”。

答案 1 :(得分:2)

DotNetZip执行RFC 1950 (ZLIB)RFC 1951 (DEFLATE)RFC 1952 (GZIP)。 它为所有三个使用相同的底层压缩引擎。

DotNetZip也会制作ZIP文件。