12 compression
我试图压缩每个大约4 KB的TCP数据包.数据包可以包含任何字节(从0到255).我发现的压缩算法的所有基准都是基于更大的文件.我没有找到任何比较小文件上不同算法的压缩比的东西,这就是我需要的.我需要它是开源的,所以它可以在C++上实现,所以没有例如RAR.对于大小约4千字节的小文件,可以推荐什么算法?LZMA?HACC?ZIP?gzip?bzip2?
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.
这是我已投赞成票的 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)
| 归档时间: |
|
| 查看次数: |
10203 次 |
| 最近记录: |