lz4壓縮格式 block

2021-10-05 02:36:16 字數 2229 閱讀 8309

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有被常稱作滑動視窗演算法。至於這麼生成字典的原因,其實很簡單,因為我們認為乙個要壓縮的字串很有可能與上下文相關,也就是說...