4

首先,让我们定义一些经常混淆的术语:

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 以强制它在命令上给我原始的放气(通过“未记录的功能”)......但是,添加 gzip 标头和预告片并不适合我。

有人知道这样做的.net 库吗?


澄清:

HTTP 1.1 的deflate压缩格式其实就是zlib压缩格式。Zlib 是 deflate 的包装器;它总是有一个 2 字节的头部和一个 4 字节的尾部(当压缩方法和级别相同时)。

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

deflate是一种用于压缩数据的压缩算法。当放气数据周围没有包装器方法(例如,标题或预告片)时,我将其称为“放气”——也许我应该将其称为“原始放气”

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

4

2 回答 2

3

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

DotNetZip 也可以处理 ZIP 文件。

于 2010-11-05T02:57:14.187 回答
3

根据我对标准文档的阅读以及我对 zlib、.NET gzip 和 deflate 实现以及其他几个 .NET 压缩包所做的工作,我确定:

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

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

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

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

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

考虑到原始的 deflate 数据,我不知道允许您生成 zlib 或 gzip 文件的 C# 库,但如果您研究标准文档,您应该能够相当容易地构建它们。

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

于 2010-09-10T20:25:16.870 回答