在.NET中实现良好的zlib?

时间:2009-02-04 20:45:58

标签: c# .net zlib

我正在构建一个网络应用程序,需要能够从正常网络流量切换到中间流的zlib压缩流。我对这个问题的看法涉及布尔开关,当打开时会导致网络代码通过我可以将IEnumerable<byte>输入的类传递所有数据,然后拉出解压缩的流,将其传递给已经存在的协议解析代码。

我看过的事情:

  • ZLib.NET - 看起来有点...... Ecclectic,而不是我想要的。尽管如此,仍然会有一个不错的开端。 (Jon Skeet's comments here也很难激励我。)
  • SharpZipLib - 这似乎根本不支持zlib?任何人都可以确认或否认这个吗?

我非常喜欢和所有托管的解决方案,但是让我们拥有它......在.NET中有没有这个库的任何其他实现,可能更适合我想做的事情,或者我应该采取ZLib.NET并将其作为一个开始?

PS:

Jon要求提供更多细节,所以就是这样。

我正在尝试实施MCCP 2。这涉及在网络流中发送的信号,并且该信号之后的所有内容都是zlib压缩数据流。在上面的链接中,它们与它们的含义完全相同。无论如何,要清楚,我正在接收这个(客户端,而不是服务器),我已经从网络流中读出了一堆数据,并且切换将在此中间(在所有至少可能性,所以任何解决方案都需要能够在接管NetworkStream之前将一些额外的数据输入其中(或者我手动输入其余的数据)。

6 个答案:

答案 0 :(得分:3)

SharpZipLib支持ZLib。查看the FAQ

此外,您是否检查过System.IO.Compression命名空间是否支持您需要的内容?

我不会使用IEnumerable<byte> - 流被设计为链接在一起。

编辑:好的......听起来你需要一个支持缓冲的流,但控制力比BufferedStream提供的更多。如果您看到解压缩切换,则需要“回放”流,然后在其上创建GZipStream。你的缓冲区需要至少与你对Read()的最大调用一样大,这样你就可以有足够的缓冲区来回放。

答案 1 :(得分:3)

DotNetZip中包含ZlibStream,用于压缩或解压缩zlib数据流。你没有问,但也有一个GZipStream和一个DeflateStream。和ZlibCodec类一样,如果这是你的事情。 (只是膨胀或放气缓冲区,而不是流)。

DotNetZip是一个拥有自由许可证的完全托管的库。您不需要使用任何.zip功能来获取Zlib的东西。并且zlib的东西被打包为一个单独的(较小的)DLL,仅用于此目的。

答案 2 :(得分:2)

这篇文章中接受的回答是:Zlib-compatible compression streams,对你有帮助吗?

答案 3 :(得分:0)

我可以向你推荐Gerry Shaw的.NET的zlib包装器:

  

http://www.organicbit.com/zip/

答案 4 :(得分:0)

据我所知,ZLib(gzip)库不支持列出标题中的文件。假设对你很重要,但这似乎是一个很大的缺点。这是我刚才使用sharp zip库的时候,所以我愿意删除它:)

答案 5 :(得分:0)

古老的问题,但是System.IO.Compression.DeflateStream实际上是正确的答案,如果您需要适当的zlib支持:

从.NET Framework 4.5开始,DeflateStream类使用 zlib库。结果,它提供了更好的压缩算法 并且在大多数情况下,压缩文件比其提供的压缩文件小 .NET Framework的早期版本。

没有比这更好的了。