首页 > 代码库 > 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

就可以看到文件头信息了:



duobao@ubuntu:~/tmp$ lzmainfo a.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 是以十进制方式存放的 ,有兴趣自己算一算就能明白了