小4 KB文件的最佳压缩算法是什么?

12 compression

我试图压缩每个大约4 KB的TCP数据包.数据包可以包含任何字节(从0到255).我发现的压缩算法的所有基准都是基于更大的文件.我没有找到任何比较小文件上不同算法的压缩比的东西,这就是我需要的.我需要它是开源的,所以它可以在C++上实现,所以没有例如RAR.对于大小约4千字节的小文件,可以推荐什么算法?LZMAHACCZIPgzipbzip2

Ric*_*tty 13

选择最快的算法,因为您可能关心实时这样做.通常对于较小的数据块,算法压缩大致相同(给出或占用几个字节),主要是因为除了有效载荷之外,算法还需要传输字典或霍夫曼树.

我强烈推荐Deflate(由zlib和Zip使用)有很多原因.该算法非常快,经过良好测试,获得BSD许可,并且是Zip支持的唯一压缩(根据infozip Appnote).除了基础知识,当它确定压缩大于解压缩大小时,存在一个STORE模式,它只为每个数据块增加5个字节(最大块为64k字节).除了STORE模式,Deflate支持两种不同类型的霍夫曼表(或词典):动态和固定.动态表意味着霍夫曼树作为压缩数据的一部分被传输,并且是最灵活的(用于不同类型的非随机数据).固定表的优点是该表是所有解码器都知道的,因此不需要包含在压缩流中.解压缩(或Inflate)代码相对容易.我已经直接编写了基于zlib的Java和Javascript版本,它们的表现相当不错.

提到的其他压缩算法有其优点.我更喜欢Deflate,因为它在压缩步骤和特别是在解压缩步骤中都具有运行时性能.

澄清一点:Zip不是压缩类型,它是一个容器.为了进行数据包压缩,我会绕过Zip,只使用zlib提供的deflate/inflate API.


Mat*_*son 7

ASCII 消息压缩散点图

这是我已投赞成票的 Rick 出色答案的后续内容。不幸的是,我无法在评论中包含图像。

我遇到了这个问题,并决定尝试对大小从 6 到 340 字节不等的 500 条 ASCII 消息样本进行 deflate。每条消息都是由环境监测系统生成的一点数据,通过昂贵的(按字节付费)卫星链路进行传输。

最有趣的观察是,压缩后消息变小的交叉点与生命、宇宙和一切的终极问题相同:42字节。

要在您自己的数据上尝试此操作,这里有一些 Node.js 可以提供帮助:

const zlib = require('zlib')
const sprintf = require('sprintf-js').sprintf
const inflate_len = data_packet.length
const deflate_len = zlib.deflateRawSync(data_packet).length
const delta = +((inflate_len - deflate_len)/-inflate_len * 100).toFixed(0)
console.log(`inflated,deflated,delta(%)`)
console.log(sprintf(`%03i,%03i,%3i`, inflate_len, deflate_len, delta))
Run Code Online (Sandbox Code Playgroud)


Dav*_*ary 5

如果要"压缩TCP数据包",可以考虑使用RFC标准技术.

  • RFC1978 PPP预测器压缩协议
  • 使用DEFLATE进行RFC2394 IP有效负载压缩
  • 使用LZS的RFC2395 IP有效负载压缩
  • RFC3173 IP有效载荷压缩协议(IPComp)
  • 使用ITU-T V.44分组方法的RFC3051 IP有效载荷压缩
  • 使用IPv6控制协议进行IPv6数据报压缩的RFC5172协商
  • RFC5112用于信令压缩的存在特定静态字典(Sigcomp)
  • RFC3284 VCDIFF通用差分和压缩数据格式
  • RFC2118 Microsoft点对点压缩(MPPC)协议

我可能忽略了其他相关的RFC.