基于lz77算法的分区编码压缩方法

文档序号:9846361阅读:1315来源:国知局
基于lz77算法的分区编码压缩方法
【技术领域】
[0001]本发明涉及数据处理技术领域,特别是涉及一种基于LZ77算法的分区编码压缩方法,适合于计算机数据的快速压缩和快速解压缩应用。
【背景技术】
[0002]1977年以色列教授Jcacob Ziv和Abraham Lempel提出了著名的LZ77算法。如今,LZ77算法已被广泛应用于各种数据压缩处理领域,由其派生的各种压缩算法也层出不穷,但都是属于LZ77算法这一大类。目前,各压缩算法不断改进,一个完美的压缩算法不仅要达到较高的压缩率,也对算法健壮性具有较高要求,同时,也要求算法具有快速处理能力,以适应信息技术领域不断高速发展的需求。而本发明即是一种LZ77派生算法,因其具有独创性的编码方式,所以具备了极快速处理,较高的压缩率,较强的健壮性等特点,是一种非常优秀的LZ77类的派生算法。

【发明内容】

[0003]为了提供一种快速高效的压缩解压算法,本发明的技术方案是,
[0004]一种基于LZ77算法的分区编码压缩方法,包括以下步骤:
[0005]压缩步骤:
[0006]步骤1:采用哈希表获得待压缩数据的压缩序列:(off,lenC,lenL,原始码)序列;
[0007]步骤2:对于(off,lenC,lenL,原始码)序列进行临时变量替换,令T_lenC =lenC-4,替换原序列的IenC分量,生成新的序列(off,T_lenC,lenL,原始码)序列;
[0008]步骤3:对于(off,T_lenC,lenL,原始码)序列进行分区编码;
[0009]首先将(off,T_lenC,lenL,原始码)序列进行分区处理,使用分区a区存放三元组(off,T_lenC,IenL)序列,使用分区b区存放原始码序列,然后执行编码方案生成a区的二次压缩数据,编码方案采用快速编码方法或紧凑编码方法,采用快速编码方法转至步骤4执行,采用紧凑编码方法转至步骤5执行:
[0010]步骤4:快速编码方法,
[0011]将三元组(off,T_lenC,lenL)临时区的单个三元组表项结构定义为4字节结构,其中off元素以2字节表示,T_lenC和IenL分别以I字节表示,整个临时区由若干个连续的三元组表项组成,然后对所有的(off,T_lenC,lenL)三元组进行预处理,以消除T_lenC和IenL的值超过255的情况,然后将预处理以后的三元组序列(off,T_lenC,lenL)存放在临时区,对临时区数据进行二次压缩编码,具体编码规则如下:将每一个(off,T_lenC,lenL)三元组表示为压缩前缀三元组(a,b,c)和短码本体三元组(x,y,z),其中a+x编码off, b+y编码T_lenC,c+z编码lenL,a为2位标志位,若a = 0,表示x占用4位,若a =1,表示X占用8位,若a = 2,表示X占用12位,若a = 3,表示x占用16位,b为I标志位,若b = 0,表示y占用4位,若b = 1,表示y占用8位,c为I位标志位,若c = 0,表示z占用4位,若c = 1,表示z占用8位;将(off,T_lenC,lenL)三元组表示为压缩前缀三元组(a, h, c)和短码本体三元组(X,y,z)后,将前缀三元组(a,h, c)存放在c区,将短码本体三元组(X,y,z)存放在d区;
[0012]对所有的(off,T_lenC,lenL)三元组完成编码后,形成两个存放数据的分区c区和d区,这两个分区构成原有的用于存放三元组序列的分区a区,完成编码,跳至步骤8 ;
[0013]步骤5:紧凑编码方法,
[0014]首先判断输入数据流的长度,小于等于8192字节时执行步骤6,否则执行步骤7 ;
[0015]步骤6:对于三元组(off,T_lenC,lenL),
[0016]a.若lenL〈3,则IenL用2位二进制数表示,再加一位前缀位,将其编码为0ΧΧ,并存放到c区;
[0017]b.若18> = lenL> = 3,用4位二进制表示(lenL_3)的值,再加一位前缀位1,编码为1XXXX,并存放到c区;
[0018]c.若lenL>18,用16位二进制数表示IenL的值,将值存放到d区,并生成一个特殊标志011的3位二进制数,存放到c区;
[0019]d.若T_lenC〈4且off〈512,则T_lenC用2位二进制数表示,off可用9位二进制数表示,再加上2位前缀位00,将(off,T_lenC)编码为00+ΧΧ以及XXXXXXXXX,存放到c区;
[0020]e.若 T_lenC<4 且 512< = off〈8192,则 T_lenC 用 2 位二进制数表示,off 用 13位二进制数表示,再加上2位二进制数为01的前缀位,将(off,T_lenC)编码为01+XX以及XXXXXXXXXXXXX,存放到 c 区;
[0021]f.若 4〈 = T_lenC〈19 且 off〈512,则(T_lenC_4)用 4 位二进制数表示,off 可用9位二进制数表示,再加上2位二进制数10的前缀位,将(off,T_lenC)编码为10+XXXX以及XXXXXXXXX,存放到C区;
[0022]g.若 4〈 = T_lenC〈19 且 512< = off〈8192,则(T_lenC_4)用 4 位二进制数表示,off用13位二进制数表示,再加上2位二进制数11前缀位,将(off,T_lenC)编码为11+XXXX 以及 XXXXXXXXXXXXX,存放到 c 区;
[0023]h.gT_lenC> = 19 且 off〈512,则 T_lenC用 16 位二进制数表示,off 用 9 位二进制数表示,再加上2位二进制数前缀位10,将(off,T_lenC)编码为10+1111以及XXXXXXXXX,存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
[0024]1.若 T_lenC> = 19 且 512〈 = off〈8192,则 T_lenC 用 16 位二进制数表示,off 用13位二进制数表示,再加上2位二进制数前缀位11,将(off,T_lenC)编码为11+1111以及XXXXXXXXXXXXX,并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
[0025]完成编码,跳至步骤8 ;
[0026]步骤7:
[0027]a.若lenL〈3,则IenL用2位二进制数表示,再加一位前缀位,编码为0ΧΧ,并存放到c区;
[0028]b.若18> = lenL> = 3,用4位二进制表示(lenL_3)的值,再加一位前缀位1,将IenL分量编码为1XXXX,并将其存放到c区。
[0029]c.若lenL>18,用16位二进制数表示IenL的值,将IenL的值存放到d区,并生成一个3位二进制数的特殊标志011,存放到c区;
[0030]d.若T_lenC〈4且off〈512,则T_lenC用2位二进制数表示,off用9位二进制数表示,再加上2位前缀位,将(off,T_lenC)编码为00+ΧΧ以及XXXXXXXXX,并存放到c区;
[0031]e.若 T_lenC<4 且 512< = off〈8192,则 T_lenC 用 2 位二进制数表示,off 用 13位二进制数表示,再加上2位二进制数01前缀位,将(off,T_lenC)编码为01+XX以及XXXXXXXXXXXXX,存放到 c 区;
[0032]f.若 4〈 = T_lenC〈19 且 off〈512,则(T_lenC_4)用 4 位二进制数表示,off 用 9位二进制数表示,再加上3位二进制数前缀位100,将(off,T_lenC)编码为100+XXXX以及XXXXXXXXX,并将其存放到c区;
[0033]g.若 4〈 = T_lenC〈19 且 512〈 = off〈8192,则(T_lenC_4)用 4 位二进制数表示,off用13位二进制数表示,再加上2位二进制数前缀位11,将(off,T_lenC)编码为11+XXXX以及XXXXXXXXXXXXX,存放到c区;
[0034]h.若 T_lenC〈15 且 off〉= 8192,则 T_lenC 用 4 位二进制数表示,off 用 16 位二进制数表示,再加上3位二进制数前缀位101,将(off,T_lenC)编码为101+XXXX以及XXXXXXXXXXXXXXXX,存放到 c 区;
[0035]1.若 T_lenC> = 19 且 off〈512,则 T_lenC 用 16 位二进制数表示,off 用 9 位二进制数表示,再加上3位二进制数前缀位100,将(off,T_lenC)编码为100+1111以及XXXXXXXXX,存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
[0036]j.若 T_lenC> = 19 且 512〈 = off〈8192,则 T_lenC 用 16 位二进制数表示,off 用13位二进制数表示,再加上2位二进制数前缀位11,将(off,T_lenC)编码为11+1111以及XXXXXXXXXXXXX,并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
[0037]k.若 T_lenC> = 15 且 off〉= 8192,则 T_lenC 用 16 位二进制数表示,off 用 16位二进制数表示,再加上3位二进制数前缀位101,将(off,T_lenC)编码为101+1111以及XXXXXXXXXXXXXXXX,存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
[0038]对所有的三元组(off,T_lenC,lenL)完成编码以后,形成了 c区数据序列和d区数据序列,c区和d区共同构成a区;
[0039]完成编码,执行步骤8 ;
[0040]步骤8:
[0041]在a区头部生成若干个标志字节,然后将a区和b区组合在一起,并且在头部生成若干的标志字节,完成压缩过程;
[0042]解压步骤:
[0043]步骤I)判断压缩方法为快速编码方法压缩或是紧凑编码方法,快速编码方法解压转至步骤2)执行,紧凑编码方法解压转至步骤3)执行;
[0044]步骤2)快速编码方法解压:
[0045]定义三元组(off,lenC,lenL)临时区的单个三元组表项结构为6字节结构,第I第2字节为off,第3第4字节为lenC,第5第6字节为lenL,整个临时区由若干个连续的三元组表项组成;
[0046]a区由c区和d区数据组成,取c区数据,解析前缀三元组(a,b,c),根据a,b,c的值,确定其在d区对应的(x,y,z)三元组的长度,并正确解析出x,y,z的值,将x,y,z的值填充到三元组(off,lenC,lenL)的临时区6字节结构中,直到全部解析完成,将在三元组(off,lenC,lenL)临时区填充若干个三元组(off,lenC,lenL)6字节结构,形成完整的三元组(off,lenC,lenL) 6字节结构列表;
[0047]然后,对于三元组(off,lenC,lenL) 6字节结构列表中的第二个分量IenC进行修正,令C_lenC = lenC+4,然后把C_lenC填充到IenC的位置,取代IenC的值;
[0048]然后,取第一个三元组(off,C_lenC,lenL),将b区原始码从第一个原始码开始,复制IenL的长度到输出空间,再根据off计算得到复制码首字符在输出空
当前第1页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1