首页 文章

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

提问于
浏览
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,强迫它给我原始的deflate命令(通过“未记录的功能”)...但是,添加gzip Headers 和预告片几乎没有我的联盟 .

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


Clarification:

HTTP 1.1的 deflate 压缩格式实际上是zlib压缩格式 . Zlib是放气的包装物;它有一个2字节的头和一个4字节的预告片, always (当压缩方法和级别相同时) .

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

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

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

2 回答

  • 2

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

    DotNetZip也可以使用ZIP文件 .

  • 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#库允许您生成zlib或gzip文件,给定原始deflate数据,但是如果您研究标准文档,您应该能够相当容易地构建它们 .

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

相关问题