[发明专利]基于LZ77算法的分区编码压缩方法有效
申请号: | 201510718683.9 | 申请日: | 2015-10-29 |
公开(公告)号: | CN105610447B | 公开(公告)日: | 2018-06-19 |
发明(设计)人: | 吴均 | 申请(专利权)人: | 吴均 |
主分类号: | H03M7/30 | 分类号: | H03M7/30 |
代理公司: | 长沙市融智专利事务所 43114 | 代理人: | 欧阳迪奇 |
地址: | 410011 *** | 国省代码: | 湖南;43 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 分区编码 算法 压缩 计算机处理 处理数据 存储结构 分区存储 分区域 三元组 计算机 | ||
1.一种基于LZ77算法的分区编码压缩方法,其特征在于,包括以下步骤:
压缩步骤:
步骤1:采用哈希表获得待压缩数据的压缩序列:(off,lenC,lenL,原始码)序列;其中off为窗口中匹配字符串相对窗口边界的偏移,lenC是复制码的len元素,len为可匹配的长度,lenL表示若干个原始码的长度;
步骤2:对于(off,lenC,lenL,原始码)序列进行临时变量替换,令T_lenC=lenC-4,替换原序列的lenC分量,生成新的序列(off,T_lenC,lenL,原始码)序列;
步骤3:对于(off,T_lenC,lenL,原始码)序列进行分区编码;
首先将(off,T_lenC,lenL,原始码)序列进行分区处理,使用分区a区存放三元组(off,T_lenC,lenL)序列,使用分区b区存放原始码序列,然后执行编码方案生成a区的二次压缩数据,编码方案采用快速编码方法或紧凑编码方法,采用快速编码方法转至步骤4执行,采用紧凑编码方法转至步骤5执行:
步骤4:快速编码方法,
将三元组(off,T_lenC,lenL)临时区的单个三元组表项结构定义为4字节结构,其中off元素以2字节表示,T_lenC和lenL分别以1字节表示,整个临时区由若干个连续的三元组表项组成,然后对所有的(off,T_lenC,lenL)三元组进行预处理,以消除T_lenC和lenL的值超过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为1标志位,若b=0,表示y占用4位,若b=1,表示y占用8位,c为1位标志位,若c=0,表示z占用4位,若c=1,表示z占用8位;将(off,T_lenC,lenL)三元组表示为压缩前缀三元组(a,b,c)和短码本体三元组(x,y,z)后,将前缀三元组(a,b,c)存放在c区,将短码本体三元组(x,y,z)存放在d区;
对所有的(off,T_lenC,lenL)三元组完成编码后,形成两个存放数据的分区c区和d区,这两个分区构成原有的用于存放三元组序列的分区a区,完成编码,跳至步骤8;
步骤5:紧凑编码方法,
首先判断输入数据流的长度,小于等于8192字节时执行步骤6,否则执行步骤7;
步骤6:对于三元组(off,T_lenC,lenL),
a.若lenL<3,则lenL用2位二进制数表示,再加一位前缀位,将其编码为0XX,并存放到c区;
b.若18>=lenL>=3,用4位二进制表示(lenL-3)的值,再加一位前缀位1,编码为1XXXX,并存放到c区;
c.若lenL>18,用16位二进制数表示lenL的值,将值存放到d区,并生成一个特殊标志011的3位二进制数,存放到c区;
d.若T_lenC<4且off<512,则T_lenC用2位二进制数表示,off可用9位二进制数表示,再加上2位前缀位00,将(off,T_lenC)编码为00+XX以及XXXXXXXXX,存放到c区;
e.若T_lenC<4且512<=off<8192,则T_lenC用2位二进制数表示,off用13位二进制数表示,再加上2位二进制数为01的前缀位,将(off,T_lenC)编码为01+XX以及XXXXXXXXXXXXX,存放到c区;
f.若4<=T_lenC<19且off<512,则(T_lenC-4)用4位二进制数表示,off可用9位二进制数表示,再加上2位二进制数10的前缀位,将(off,T_lenC)编码为10+XXXX以及XXXXXXXXX,存放到c区;
g.若4<=T_lenC<19且512<=off<8192,则(T_lenC-4)用4位二进制数表示,off用13位二进制数表示,再加上2位二进制数11前缀位,将(off,T_lenC)编码为11+XXXX以及XXXXXXXXXXXXX,存放到c区;
h.若T_lenC>=19且off<512,则T_lenC用16位二进制数表示,off用9位二进制数表示,再加上2位二进制数前缀位10,将(off,T_lenC)编码为10+1111以及XXXXXXXXX,存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
i.若T_lenC>=19且512<=off<8192,则T_lenC用16位二进制数表示,off用13位二进制数表示,再加上2位二进制数前缀位11,将(off,T_lenC)编码为11+1111以及XXXXXXXXXXXXX,并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
完成编码,跳至步骤8;
步骤7:
a.若lenL<3,则lenL用2位二进制数表示,再加一位前缀位,编码为0XX,并存放到c区;
b.若18>=lenL>=3,用4位二进制表示(lenL-3)的值,再加一位前缀位1,将lenL分量编码为1XXXX,并将其存放到c区;
c.若lenL>18,用16位二进制数表示lenL的值,将lenL的值存放到d区,并生成一个3位二进制数的特殊标志011,存放到c区;
d.若T_lenC<4且off<512,则T_lenC用2位二进制数表示,off用9位二进制数表示,再加上2位前缀位,将(off,T_lenC)编码为00+XX以及XXXXXXXXX,并存放到c区;
e.若T_lenC<4且512<=off<8192,则T_lenC用2位二进制数表示,off用13位二进制数表示,再加上2位二进制数01前缀位,将(off,T_lenC)编码为01+XX以及XXXXXXXXXXXXX,存放到c区;
f.若4<=T_lenC<19且off<512,则(T_lenC-4)用4位二进制数表示,off用9位二进制数表示,再加上3位二进制数前缀位100,将(off,T_lenC)编码为100+XXXX以及XXXXXXXXX,并将其存放到c区;
g.若4<=T_lenC<19且512<=off<8192,则(T_lenC-4)用4位二进制数表示,off用13位二进制数表示,再加上2位二进制数前缀位11,将(off,T_lenC)编码为11+XXXX以及XXXXXXXXXXXXX,存放到c区;
h.若T_lenC<15且off>=8192,则T_lenC用4位二进制数表示,off用16位二进制数表示,再加上3位二进制数前缀位101,将(off,T_lenC)编码为101+XXXX以及XXXXXXXXXXXXXXXX,存放到c区;
i.若T_lenC>=19且off<512,则T_lenC用16位二进制数表示,off用9位二进制数表示,再加上3位二进制数前缀位100,将(off,T_lenC)编码为100+1111以及XXXXXXXXX,存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
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区;
k.若T_lenC>=15且off>=8192,则T_lenC用16位二进制数表示,off用16位二进制数表示,再加上3位二进制数前缀位101,将(off,T_lenC)编码为101+1111以及XXXXXXXXXXXXXXXX,存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区;
对所有的三元组(off,T_lenC,lenL)完成编码以后,形成了c区数据序列和d区数据序列,c区和d区共同构成a区;
完成编码,执行步骤8;
步骤8:
在a区头部生成若干个标志字节,然后将a区和b区组合在一起,并且在头部生成若干的标志字节,完成压缩过程;
解压步骤:
步骤1)判断压缩方法为快速编码方法压缩或是紧凑编码方法,快速编码方法解压转至步骤2)执行,紧凑编码方法解压转至步骤3)执行;
步骤2)快速编码方法解压:
定义三元组(off,lenC,lenL)临时区的单个三元组表项结构为6字节结构,第1第2字节为off,第3第4字节为lenC,第5第6字节为lenL,整个临时区由若干个连续的三元组表项组成;
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字节结构列表;
然后,对于三元组(off,lenC,lenL)6字节结构列表中的第二个分量lenC进行修正,令C_lenC=lenC+4,然后把C_lenC填充到lenC的位置,取代lenC的值;
然后,取第一个三元组(off,C_lenC,lenL),将b区原始码从第一个原始码开始,复制lenL的长度到输出空间,再根据off计算得到复制码首字符在输出空间的偏移,根据C_lenC得到应该复制的长度,并根据这两个参数把复制码从前面的输出空间中复制到当前输出位置,接下来取第二个三元组(off2,C_lenC2,lenL2)重复操作,直至复制全部完成,即完成整个解压缩过程;
步骤3)紧凑编码方法解压:
定义三元组(off,lenC,lenL)临时区的单个三元组表项结构为6字节结构,第1第2字节为off,第3第4字节为lenC,第5第6字节为lenL,整个临时区由若干个连续的三元组表项组成;
a区由c区和d区数据组成,取c区数据,根据编码定义的前缀,解析出(off,lenC,lenL)三元组的具体数值,必要时,取d区的数据共同完成(off,lenC,lenL)的具体值的解析,然后将解析得到的(off,lenC,lenL)的值填充到三元组(off,lenC,lenL)的临时区6字节结构中,直到全部解析完成,将在三元组(off,lenC,lenL)临时区填充若干个三元组(off,lenC,lenL)6字节结构,形成完整的三元组(off,lenC,lenL)6字节结构列表;
然后,对于三元组(off,lenC,lenL)6字节结构列表中的第二个分量lenC进行修正,令C_lenC=lenC+4,然后把C_lenC填充到lenC的位置,取代lenC的值;
然后取第一个三元组(off,C_lenC,lenL),将b区原始码从第一个原始码开始,复制lenL的长度到输出空间,根据off计算得到复制码首字符在输出空间的偏移,根据C_lenC得到应该复制的长度,并根据这两个参数把复制码从前面的输出空间中复制到当前输出位置,接下来取第二个三元组(off2,C_lenC2,lenL2)重复操作,直至复制全部完成,即完成整个解压缩过程。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于吴均,未经吴均许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201510718683.9/1.html,转载请声明来源钻瓜专利网。
- 上一篇:双模射频收发架构
- 下一篇:电容线性度自动校正的模数转换器