2009-02-04 64 views
7

我正在构建一个网络应用程序,需要能够从正常网络流量切换到zlib压缩流,中间流。我对此事的看法涉及到布尔开关,当开启时会导致网络代码将所有数据通过一个可将IEnumerable<byte>馈入的类传递,然后取出解压缩的流,并将其传递给已存在的协议分析代码。.NET中很好的zlib实现?

事情我已经看了看:

  • ZLib.NET - 这似乎有点... Ecclectic,而不是我想要什么相当。尽管如此,仍然会有一个体面的开始。 (Jon Skeet's comments here几乎不能激发我)
  • SharpZipLib - 这似乎并不支持zlib?任何人都可以确认或否认这一点?

我非常喜欢和所有的托管解决方案,但让我们来看看...在.NET中有没有这种库的其他实现,这可能更适合我想要做的,或者我应该采用ZLib.NET并将其作为开始?

PS:

乔恩的要求更多的细节,所以在这儿呢。我想实现MCCP 2。这涉及在网络流中发送的信号,并且该信号之后的所有信息都是zlib压缩数据流。在上面的链接中有链接到它们的意思。无论如何,要清楚的是,我在接收端(客户端,而不是服务器),并且我已经从网络流中读出了一堆数据,并且切换将在这中间(全部可能性至少),所以任何解决方案都需要能够在接管NetworkStream(或我手动输入其余数据)之前将一些额外的数据输入到它中。

+0

当您获得特定数据包时,压缩包的标头是否会开始? – 2009-02-04 21:35:12

+0

我不知道这件事。就我个人而言,我不会太在意这个细节。我怀疑这是服务器实现特定的,在任何描述文档中都没有提及它。 – 2009-02-04 21:53:37

+0

您是否曾经为MCCP 2获得过良好的图书馆? – m4tt1mus 2011-07-28 22:00:31

回答

3

SharpZipLib不支持的ZLib。看看this FAQ entry

此外,你有检查是否System.IO.Compression命名空间支持你所需要的?

我不会使用IEnumerable<byte>虽然 - 流设计是链接在一起。

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

0

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

3

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

DotNetZip是一个拥有自由许可证的完全托管的图书馆。你不需要使用任何.zip功能来获得Zlib的东西。而zlib的东西被打包成一个单独的(更小的)DLL就是为了这个目的。