数据包定向无损压缩库

19

有没有人知道一个性能良好、支持C/C++的自由(非GPL)压缩库,并支持基于数据报的压缩?

所谓基于数据报,指的是像QuickLZ(GPL)一样的功能,可以压缩和解压缩流的多个数据报,同时在数据报之间维护历史记录以实现合理的压缩。

我更看重压缩比而不是CPU使用率,只要CPU使用率不过分。但我很难找到这个功能,所以任何东西都值得关注。


拥有面向数据包的压缩有什么好处呢?当您维护来自先前数据包的字典时,您无论如何都需要解压缩所有先前的数据包。 - Juraj Blaho
当然,您需要解压缩“所有先前的数据包”。但许多应用程序仅对它们个别到达的每个数据包感兴趣。另一方面,压缩算法对数据流本身感兴趣以检测熵,并因此希望随着时间的推移建立其状态。目标应该足够明显:允许发送者传输包含冗长(即低熵)数据的数据包,并具有自动最小化实际发送位数的压缩算法。 - porgarmingduod
2
我认为OP想要一个保证,即他将及时获得小块的解压缩数据,而不必等待完全解压缩才能获取任何数据。 - Michael Kohne
你有没有找到一个好的解决方案? - Alastair Maw
是的,我做到了,只是花了我一些时间。我刚才接受的答案实际上非常不错。 - porgarmingduod
显示剩余3条评论
5个回答

9

zlib的主要deflate()函数带有一个flush参数,它允许各种不同的刷新模式。如果你在每个数据包的末尾传递Z_SYNC_FLUSH,那么应该会产生所需的效果。

详细信息请参见zLib手册

bzip2也具有刷新功能,这可能会让您执行此类操作。请参见http://www.bzip.org/1.0.5/bzip2-manual-1.0.5.html#bzCompress


是的。而zlib许可证不是强制版权许可证。它更类似于BSD或MIT而不是GPL。基本上,你只需要遵守两点:1)在重新分发源代码时不能删除版权声明;2)修改它后不能再称其为ZLib。 - Brian McFarland
这实际上是一种相当不错的方法;Z_SYNC_FLUSH 保留了压缩状态,只需写入足够的数据,以便接收端可以读取到目前为止已经写入的内容。我想,虽然一年半后才接受仍然比永远不接受要好 :) - porgarmingduod
我想在这里补充一点,即http://code.google.com/p/lzham/(截至alpha8)支持zlib风格的刷新,并且可以以不同的性能特征以相同的方式使用。 - porgarmingduod

5

如果您需要速度而不是压缩,并且只想节省适量的空间,那么Google的Snappy可能是一个不错的选择。

另外,Ilia Muraviev曾经在公共领域中放置了一个名为BALZ的小型压缩代码。它非常适用于许多类型的数据。

这两种压缩方式都支持流刷新和独立状态变量,以在数据包之间执行多个并发流。


他们这样做吗?我在 Snappy 中找不到 - 看起来它只是使用无状态函数进行压缩。BALZ 是命令行,而不是库,看起来它只是将 stdin 分块流式传输,根本不支持数据包类型的东西? - Alastair Maw

2
Google的新SPDY协议使用zlib压缩单个消息,并维持zlib状态以实现更好的压缩效果。我不认为有一个独立的库可以完全处理这种行为,但是有几个开源的SPDY实现可以向您展示如何实现此功能。

有趣的想法,很好地提出了这个问题。你知道如何合理地发送小消息吗? - porgarmingduod

1
公共领域的Crush算法由Ilia Muraviev开发,与QuickLZ相比具有类似的性能和压缩比,但Crush更加强大。这两种算法在概念上也相似,但Crush包含更多技巧。
BALZ算法也是由Ilia Muraviev开发的,先前已经提到过。
请参见http://compressme.net/

0

也许你可以使用lzma压缩SDK,它是由Igor Pavlov编写并放置在公共领域。

而且,由于它可以压缩流文件,并具有内存到内存的压缩功能,我认为可能可以压缩数据包流(也许需要进行一些更改),但不确定。


1
有很多开源的、免费使用的压缩库。压缩也是高度技术性的过程。仅仅假设 lzma 可以轻松修改以处理小数据包(一个完全不同的问题),需要更多的信息和确认,而不是简单的“可能”和“不确定”。 - porgarmingduod

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