.NET中好的zlib实现?

9
我正在构建一个网络应用程序,需要能够在传输过程中从普通网络流量切换到zlib压缩流。我的想法是使用布尔开关,当打开时,网络代码将通过一个类来传递所有数据,然后从中提取出解压缩的流,将其传递给已存在的协议解析代码。
我查看了以下内容:
  • ZLib.NET - 它似乎有点...杂乱,并不完全符合我的要求。但仍可以作为起点进行构建(Jon Skeet's comments here并没有给我很大启示)。
  • SharpZipLib - 这似乎根本不支持zlib?有人可以确认或否认吗?
我很希望使用全管理解决方案,但是让我们看看...在.NET中是否有此库的其他实现,可能更适合我想要做的事情,或者我应该使用ZLib.NET并以此为起点构建?PS:Jon要求更多细节,所以这里是。我正在尝试实现MCCP 2。这涉及在网络流中发送信号,而此信号之后的所有内容均为zlib压缩数据流。以上链接中有关于它们的确切含义的链接。无论如何,要明确,我处于接收端(客户端,而非服务器),我已经从网络流中读取了大量数据,并且切换将在其中(最有可能至少在其中),因此任何解决方案都需要能够在接管NetworkStream之前将一些额外的数据提供给它(或者我手动提供其余的数据)。

你有没有找到一个好的MCCP 2库? - m4tt1mus
@m4tt1mus:我不认为我曾经让这个工作起来。不过,如果你有兴趣的话,我可以尝试找到我的代码,我想我还在某个地方保存着它。 - Matthew Scharley
我可能会尝试在我的.NET项目中以某种方式使用C库。不过我对C并不是很擅长。 - m4tt1mus
@m4tt1mus:这总是有可能的。研究一下Interop或P/Invoke,两种方法都可以。 - Matthew Scharley
@MatthewScharley 你好,距离你发布这篇文章已经过去了13年,但我想说我成功地使用SharpZipLib实现了MCCP2解压缩。虽然.NET 6有ZLibStream,但在消息/数据包中间需要在解压缩和压缩之间切换(在从流中读取数据后),这使得使用它变得不可行。/招手 - Dan Rigby
显示剩余2条评论
5个回答

6

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

此外,您是否已经检查了System.IO.Compression命名空间是否支持您所需的功能?

不过我不会使用IEnumerable<byte> - 流是设计成可以链接在一起的。

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


我同意你关于IEnumerable的观点...但事实是,在将网络流连接到它之前,我找不到一种将已经读取的数据推送到zlib流中(因为这个转换发生在中间)的方法。有什么建议吗? - Matthew Scharley
我不完全清楚你在做什么。你有两个不同的输出流,想要在它们之间切换吗?实际上,我并不真正“理解”你是在读还是在写。在问题中提供更多的解释可能会得到更好的建议 :) - Jon Skeet
好的,我用 BufferedStream 包装了我的 NetworkStream 然后... 什么都没有发生。BeginRead 只是卡在那里什么都不做。据推测它在等待一个完整的缓冲区先到来,但是之前我使用的是 4k 的读取缓冲区,并且显然一个登录界面不会占用那么多空间。 - Matthew Scharley
我放弃了BufferedStream,转而采用逐字节读取的方式,因为我的处理函数本来就是一个逐字节状态机。 - Matthew Scharley
很酷 - 这让生活变得简单了很多 :) - Jon Skeet

3
DotNetZip中包含了一个ZlibStream,用于压缩或解压zlib数据流。你可能不会问,但还有一个GZipStream和一个DeflateStream。以及一个ZlibCodec类,如果你需要的话。(只是对缓冲区进行膨胀或压缩,而不是数据流)。
DotNetZip是一个完全托管的库,具有自由许可证。你不需要使用任何.zip功能来获取Zlib内容。而且zlib内容被打包成一个单独(更小)的DLL,专门为此目的而设计。

0

这是预发布版,我正在针对mono进行构建,所以我很想避免麻烦,但我仍然会去了解一下。 - Matthew Scharley
我们现在已经在生产中使用这个东西超过2年了,无论是在.NET还是Mono上都没有出现任何问题。 - Dirk Vollmar

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

这是远程控制台上的网络压缩。没有文件名,所以并不太重要。但是作为对你回答的回应,有相当多的压缩方式不支持(例如gzip和bzip2),这就是为什么它们通常与tar一起使用的原因。 - Matthew Scharley
这实际上是用于压缩的.NET库(我想到了gzip),但它没有显示文件名。 - Chris S
抱歉,Monoxide,我应该更仔细地阅读问题...再见,10分钟后发布。 - Chris S

-1

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

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

没有比这更好的了。


zlib压缩格式并不等同于zlib库。zlib库包含了deflate(RFC 1951)和zlib(RFC 1950)两种压缩格式的实现。 - Nick Whaley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接