8

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

我看过的东西:

  • ZLib.NET - 看起来有点……不拘一格,并不是我想要的。尽管如此,仍然会是一个不错的开始。(Jon Skeet 在这里的评论也几乎没有启发我。)
  • SharpZipLib - 这似乎根本不支持 zlib?任何人都可以确认或否认这一点吗?

我非常喜欢所有托管解决方案,但让我们来看看......在.NET中是否有这个库的任何其他实现,这可能更适合我想要做的事情,或者我应该使用ZLib。 NET 并以此为起点?

PS:

乔恩要求提供更多细节,所以就在这里。

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

4

5 回答 5

4

SharpZipLib 确实支持 ZLib。查看常见问题解答

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

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

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

于 2009-02-04T20:56:42.103 回答
3

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

DotNetZip 是一个具有自由许可证的完全托管库。您无需使用任何 .zip 功能即可获取 Zlib 内容。为了这个目的,zlib 的东西被打包为一个单独的(更小的)DLL。

于 2009-03-06T16:14:34.420 回答
0

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

于 2009-02-04T21:13:56.590 回答
0

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

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

于 2009-02-04T20:55:04.447 回答
-1

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

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

没有比这更好的了。

于 2020-09-21T15:12:16.250 回答