首页 > 代码库 > lzma 知识点滴
lzma 知识点滴
LZMA(Lempel-Ziv-Markov chain-Algorithm的缩写)是2001年以来得到发展的一个数据压缩算法,它用于7-Zip归档工具中的7z格式。它使用类似于LZ77的字典编码机制,在一般的情況下压缩率比bzip2高,用于压缩的字典档案大小可达4GB。
对比集中压缩:
耗用时间 bzip >lzma2>lzma>gzip
压缩率 lzma2>bzip>gzip>lzma
最后压缩结果是 lzma的文件最小 ,果然改进版的算法有优势。
这里要看一下lzma的文件头信息
看的方法可以直接用二进制工具打开.lzma文件 ,更方便的方法是ubuntu中已经集成了lzma的查看工具 ,利用命令行
lzmainfo XXX.lzma
就可以看到文件头信息了:
a.lzma
Uncompressed size: 0 MB (20644 bytes)
Dictionary size: 8 MB (2^23 bytes)
Literal context bits (lc): 3
Literal pos bits (lp): 0
Number of pos bits (pb): 2
这里就看到了文件头打印出来的信息 ,在对比一下文件的二进制信息
00h:5d 00 00 80 00 22 01 00 00 00 00 00 00 00 26 16
10h:85 bc .....
主要就是签名这一段,这里摘录一段lzma的specification
The lzma file format layout:
Offset Size Description
0 1 LZMA model properties (lc, lp, pb) in encoded form
1 4 Dictionary size (32-bit unsigned integer, little-endian)
5 8 Uncompressed size (64-bit unsigned integer, little-endian)
13 Compressed data (LZMA stream)
LZMA properties:
name Range Description
lc [0, 8] the number of "literal context" bits
lp [0, 4] the number of "literal pos" bits
pb [0, 4] the number of "pos" bits
dictSize [0, 2^32 - 1] the dictionary size
这里就是介绍清楚了,其他不封都应该能看懂,例如8M的Dictionary size 就在1-5这四个字节 00 00 80 00
有一个lc lp pb 这个要说明一下,
p->lc = d % 9;
d /= 9;
p->pb = d / 5;
p->lp = d % 5;
这里可以看出 在第一个字节也就是5D里面包含的信息 lc pb lp 是以十进制方式存放的 ,有兴趣自己算一算就能明白了