lz4屬於lz77系列的壓縮演算法,lz77系列壓縮演算法將重複的字串(也稱為匹配)表示成(offset、match length)來對資料進行壓縮。lz77演算法只是一種思想,尋找匹配的方式有很多中,常見的有hash chain、bst,這些演算法會在介紹各個通用壓縮演算法的時候介紹。
本文只介紹lz4的壓縮格式,詳細的演算法實現會放在另外文章裡面講。
lz4實現了兩種格式,分別叫block、frame
名詞翻譯說明:
序列的格式如下:
高4bit
低4bit
0-n byte
0-n byte
2 byte
0-n byte
未匹配的字元長度
匹配的字元長度
可選的未匹配的字元長度
未匹配的字元
offset
可選的匹配長度
序列的填值規則如下:
1.「高4bit的值」等於15,則說明「可選的未匹配的字元長度」裡面有值,小於15則「可選的未匹配的字元長度」欄位不存在。
「可選的未匹配的字元長度」部分,如果前乙個位元組的值為255,表示後面乙個位元組也是屬於該欄位。
2.「低4bit值」的儲存規則與「高4bit」一致。如果值等於15,則說明「可選的匹配長度」部分還有資料與「低4bit」一起組成匹配的字元長度。
3.「offset」欄位為固定的2個位元組,所以lz4選取的查詢視窗為固定的64kb,無法配置。該欄位採用小端格式儲存數值。最後乙個序列只包含未匹配的字串,為了與其他序列進行區分,offset的值是0
一般匹配的字元長度都比較小,「低4bit」就儲存完整的長度值,所以lz4將第乙個位元組拆成高低4位,最大限度的節約了資料的儲存,提高了壓縮率。
下面以乙個具體的例子來說明lz4_block格式。
比如輸入資料為:
abcdefghijklmnoabcdefghijklmno
lz4演算法會將該字串轉成三元組。
(『abcdefghijklmno』(未匹配的字串),15(offset),15(match length))
轉成位元組流如下:
高4bit
低4bit
1 byte
15 byte
2 byte
1 byte
1515
0abcdefghijklmno150
從上面可以看到,lz4_block格式沒有header欄位,一般的壓縮演算法有許多引數可選,比如視窗大小,擋位,是否進行crc校驗等。當這些引數在解壓的時候需要知道,則壓縮格式中會設計header部分,並將這些資料儲存進去,供解壓的時候使用。
int
decode
(char
* input,
int inlen,
char
* output,
int outlen)
literallen +
=*inp;
inp++;}
decodesize +
= literallen;
memcpy
(outp, inp, literallen)
; inp +
= literallen;
outp +
= literallen;
//解碼offset
int offset =
*(inp +1)
; offset =
(offset <<8)
+*inp;
inp +=2
;// 解碼matchlen
if(offset >0)
matchlen +
=*inp;
inp++;}
unsigned
char
* matchpos =
(unsigned
char*)
(output + decodesize)
- offset;
for(
int i =
0; i < matchlen; i++
) decodesize +
= matchlen;
outp +
= matchlen;}if
(inp -
(unsigned
char
*)input >= inlen)
}return decodesize;
}
lz4壓縮的使用
安裝 git clone cd lz4 make make install 壓縮單個檔案命令,預設生成 filename.lz4 檔案 lz4 filename 如果希望壓縮率最高,可以加上 9 引數,這是壓縮率最高但是最慢的壓縮級別 但是和 1 比起來解壓縮速度差不多 lz4 9 filename...
linux下lz4解壓縮遇到的那些事兒
這是 一.debian系列 debian ubuntu等 1.1 kali下修改apt get源 vim etc apt sources.list deb sana main non free contrib deb security sana updates main contrib non fr...
演算法 LZ77壓縮演算法
本人認為lz77演算法其實是字典壓縮的乙個變種,與字典壓縮不同的是,它的字典是動態生成的並且只有乙個,一般選取一定數量的最近壓縮過資料。儲存這些資料的結構叫做滑動視窗,所以lz77有被常稱作滑動視窗演算法。至於這麼生成字典的原因,其實很簡單,因為我們認為乙個要壓縮的字串很有可能與上下文相關,也就是說...