我正在构建一个网络应用程序,需要能够从正常的网络流量切换到zlib压缩流,即中流。我对这个问题的看法涉及布尔开关,当打开时会导致网络代码通过我可以将IEnumerable<byte>
输入的类传递所有数据,然后拉出解压缩的流,将其传递给现有的协议解析代码。
我看过的事情:
我非常喜欢和所有托管的解决方案,但是让我们拥有它......在.NET中是否存在这个库的任何其他实现,可能更适合我想要做的事情,或者我应该采用ZLib。 NET并建立起来作为一个开始?
PS:
乔恩要求更多细节,所以在这里。
我正在尝试实施MCCP 2。这涉及在网络流中发送的信号,并且该信号之后的所有内容都是zlib压缩数据流。在上面的链接中,它们与它们的含义完全相同。无论如何,要清楚,我正在接收这个(客户端,而不是服务器),我已经从网络流中读出了一堆数据,并且切换将在此中间(在所有至少可能),所以任何解决方案都需要能够在接管NetworkStream之前将一些额外的数据输入其中(或者我手动输入其余的数据)。
包含在DotNetZip中的是ZlibStream,用于压缩或解压缩zlib数据流。你没有问,但也有一个GZipStream和一个DeflateStream。和ZlibCodec类一样,如果这是你的事情。 (只是膨胀或放气缓冲区,而不是流)。
DotNetZip是一个拥有自由许可证的完全托管的库。您不需要使用任何.zip功能来获取Zlib的东西。并且zlib的东西被打包为一个单独的(较小的)DLL,仅用于此目的。
SharpZipLib确实支持ZLib。看看the FAQ。
此外,您是否检查过System.IO.Compression命名空间是否支持您需要的内容?
我不会使用IEnumerable<byte>
- 流被设计为链接在一起。
编辑:好的...听起来你需要一个支持缓冲的流,但比BufferedStream
提供的控制更多。如果您看到解压缩切换,则需要“回放”流,然后在其上创建GZipStream。你的缓冲区需要至少与你对Read()的最大调用一样大,这样你总能有足够的缓冲区来回放。
这篇文章中接受的答案是:Zlib-compatible compression streams,对你有帮助吗?
我可以推荐Gerry Shaw的.NET的zlib包装器:
据我所知,ZLib(gzip)库不支持在头文件中列出文件。假设对你很重要,但这似乎是一个很大的缺点。这是我刚才使用尖锐的zip库,所以我愿意删除这个:)