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 是以十進制方式存放的 ,有興趣自己算一算就能明確了