CN105610447A - 基于lz77算法的分区编码压缩方法 - Google Patents
基于lz77算法的分区编码压缩方法 Download PDFInfo
- Publication number
- CN105610447A CN105610447A CN201510718683.9A CN201510718683A CN105610447A CN 105610447 A CN105610447 A CN 105610447A CN 201510718683 A CN201510718683 A CN 201510718683A CN 105610447 A CN105610447 A CN 105610447A
- Authority
- CN
- China
- Prior art keywords
- lenc
- lenl
- district
- triple
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明公开了一种基于LZ77算法的分区编码压缩方法,通过独创性的存储结构,即将三元组(off,len,c)序列分区编码,分区存储。这样将更加有利于计算机分区域处理数据,能够极大地加快计算机处理压缩数据的速度。
Description
技术领域
本发明涉及数据处理技术领域,特别是涉及一种基于LZ77算法的分区编码压缩方法,适合于计算机数据的快速压缩和快速解压缩应用。
背景技术
1977年以色列教授JcacobZiv和AbrahamLempel提出了著名的LZ77算法。如今,LZ77算法已被广泛应用于各种数据压缩处理领域,由其派生的各种压缩算法也层出不穷,但都是属于LZ77算法这一大类。目前,各压缩算法不断改进,一个完美的压缩算法不仅要达到较高的压缩率,也对算法健壮性具有较高要求,同时,也要求算法具有快速处理能力,以适应信息技术领域不断高速发展的需求。而本发明即是一种LZ77派生算法,因其具有独创性的编码方式,所以具备了极快速处理,较高的压缩率,较强的健壮性等特点,是一种非常优秀的LZ77类的派生算法。
发明内容
为了提供一种快速高效的压缩解压算法,本发明的技术方案是,
一种基于LZ77算法的分区编码压缩方法,包括以下步骤:
压缩步骤:
步骤1:采用哈希表获得待压缩数据的压缩序列:(off,lenC,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)重复操作,直至复制全部完成,即完成整个解压缩过程。
所述的一种基于LZ77算法的分区编码压缩方法,所述的步骤1中采用哈希表获得待压缩数据的压缩序列(off,lenC,lenL,原始码)序列的步骤包括:
步骤一:定义用于组成哈希表并存储字符指针的哈希表项,并将所有哈希表项的值初始化为0,同时把当前字符指针和原始码指针均设为0;
步骤二:判断当前字符指针+3的值是否小于数据块尾部偏移量:
如果是,则取当前字符指针指向的字符及其后连续的3个字符,作为一个32位二进制数计算哈希值,用得到的哈希值表示哈希表项的序号,查询该序号下的哈希表项的值,如果为0,则将当前字符指针存入哈希表,再将当前字符指针加1,从头开始执行步骤二,如果不为0,取得该表项的具体数值,然后转向步骤三;
否则转向步骤六;
步骤三:将步骤二获得的哈希表项的具体数值,表示为一个待匹配字符指针,把当前字符指针指示的字符及所有后续字符,与待匹配字符指针指示的字符及所有后续字符进行字符串最大匹配,获得最大匹配长度。
然后以当前字符指针的值给步骤二指示的哈希表项赋值,取代原来的哈希表项的值,
然后再以字符串最大匹配长度的值进行比较判断,如果长度>=4,则表示匹配成功,转向步骤四,否则表示匹配不成功,转向步骤五;
步骤四:输出(off,lenC,lenL,原始码)序列,其中原始码是从原始码指针指示的字符,直到当前字符指针-1指示的字符为止的这一段字符串,off是步骤三中获得的待匹配字符串的相对偏移量,即当前字符指针-待匹配字符串指针,lenC是步骤三中得到的字符串最大匹配长度,lenL是原始码的长度;然后将原始码指针+lenC+lenL,重新赋值给原始码指针,再令当前字符指针等于重新赋值以后的原始码指针;
然后,判断当前字符指针是否小于等于数据块尾部偏移量,如果是,转向步骤二继续执行,否则转向压缩步骤的步骤2;
步骤五:令当前字符指针加1,然后转向步骤二;
步骤六:输出(0,0,lenL,原始码)到输出序列,其中lenL的值为数据块尾部偏移量-原始码指针+1,原始码的序列是从原始码指针处开始,直到数据块最后一个字符处结束,然后执行压缩步骤的步骤2。
所述的一种基于LZ77算法的分区编码压缩方法,在执行所述的压缩步骤的步骤1之前,首先将长度大于65536字节的输入数据流分割为若干个连续的长度为65536字节的数据块,且最后一个数据块的长度小于等于65536字节,然后对于每个数据块按顺序进行压缩处理,一次压缩一个数据块。
所述的一种基于LZ77算法的分区编码压缩方法,在执行压缩步骤的步骤3时,首先将(off,T_lenC,lenL,原始码)序列进行分区处理时,具体的处理步骤为:
将顺序存放的(off,T_lenC,lenL,原始码)序列分离为三元组(off,T_lenC,lenL)序列和原始码序列,并且不再将其连续存放为一个序列,而是单独将原始码序列存放在b区,a区则存放三元组(off,T_lenC,lenL)序列经过编码以后生成的数据。
所述的一种基于LZ77算法的分区编码压缩方法,在执行压缩步骤的步骤4时,预处理的步骤包括:
如果T_lenC>=255且lenL<255,则令(off,T_lenC,lenL)转换为(off,255,lenL)+4字节的形式,后续追加的4字节表示(T_lenC-255)的值。
如果lenL>=255且T_lenC<255,则令(off,T_lenC,lenL)转换为(off,T_lenC,255)+4字节的形式,后续追加的4字节表示(lenL-255)的值。
如果T_lenC>=255且lenL>=255,则令(off,T_lenC,lenL)转换为(off,255,255)+4字节+4字节的形式,后续追加的第一个4字节表示(T_lenC-255)的值,第二个4字节表示(lenL-255)的值。
所述的一种基于LZ77算法的分区编码压缩方法,在执行解压步骤的步骤2)时,需判断y的值是否等于255,若不是,则跳到下一步;若是,则继续解析下一个前缀三元组(a,b,c),并且根据a,b,c的具体值解析出下一个(x,y,z)的值,但是此时,解析出的下一个三元组(x,y,z)是一个伪三元组,由其3个元素x,y,z组成一个4字节的数值,把这个数值+255赋予上一个(x,y,z)真三元组中的y元素;
判断z的值是否等于255,若不是,则跳到下一步;若是,则继续解析下一个前缀三元组(a,b,c),并且根据a,b,c的具体值解析出下一个(x,y,z)的值,但是此时,解析出的下一个三元组(x,y,z)是一个伪三元组,由其3个元素x,y,z组成一个4字节的数值,把这个数值+255赋予上一个(x,y,z)真三元组中的z元素;
然后将x,y,z的值填充到三元组(off,lenC,lenL)的临时区6字节结构中;
在编码时,如果遇到伪三元组,视同真三元组分离出三个元素进行处理。
本发明的技术效果在于,通过提出一种独创性的存储结构,即将三元组(off,len,c)序列分区编码,分区存储。更加有利于计算机分区域处理数据,能够极大地加快计算机处理压缩数据的速度。按照本方法编写计算机程序,在计算机上运行和测试,可以观察到用本方法进行数据压缩的效果。经测试,本方法的压缩速度较快,可以达到200~300MB/s,解压缩速度极快,可以达到1GB/s左右,本方法产生的压缩文件的压缩率较高,一般在50%-60%左右。
具体实施方式
本发明是一种基于LZ77算法的派生算法。LZ77算法是由JacobZiv和AbrahamLempel提出的一种基于预读缓冲器和滑动窗口的压缩算法,通过该算法处理后,会输出一系列的三元组数据。
具体来说:
1.从当前压缩位置开始,查看未编码的数据,并试图在滑动窗口中找出最长的匹配字符串,如果找到,则进行步骤2,否则进行步骤3。
2.输出三元符号组(off,len,c)。其中off为窗口中匹配字符串相对窗口边界的偏移,len为可匹配的长度,c为下一个字符。然后将窗口向后滑动len+1个字符,继续步骤1。
3.输出三元符合组(0,0,c)。其中c为下一个字符。然后将窗口向后滑动len+1个字符,继续步骤1。
该算法给出了将输入数据流变换成三元组(off,len,c)序列的方法。而实现该算法的核心内容则需要我们精心设计三元组(off,len,c)具体的数据结构和存储结构。
本发明提出了一种独创性的存储结构,即将三元组(off,len,c)序列分区编码,分区存储。这样将更加有利于计算机分区域处理数据,能够极大地加快计算机处理压缩数据的速度。
压缩过程
首先,对于输入数据流,如果其长度大于65536字节,则将其分割为若干个连续的长度为65536字节的数据块,且最后一个数据块的长度小于等于65536字节,然后对于每个数据块按顺序进行压缩处理,一次压缩一个数据块。
对于一个长度小于等于65536字节的数据块,按以下步骤进行处理:
0.先说明哈希表的结构,哈希表是单个哈希表项连续存放而形成的一个连续存储空间。单个哈希表项为2个字节,存放的内容为字符指针,若干个哈希表项连续存放,从头到尾连续存放的若干个单独的哈希表项,每个表项具有一个序号,按数字顺序排列,为序号0,1,2,3...,根据哈希表项的序号,可以直接取得哈希表项的值,哈希表每个表项的初始值初始化为0值。
1.把当前字符指针设为0,把原始码指针设为0。
2.先判断(当前字符指针+3)的值是否小于数据块尾部偏移量,如果是,则继续步骤2的后续操作,否则转向步骤6。
然后,取当前字符指针指向的字符及其后连续的3个字符,一共4个字符,当成一个32位二进制数,计算哈希值,获得哈希值以后,使用此哈希值表示哈希表项的序号,查询该序号下的哈希表项的值,如果为0,则将当前字符指针存入哈希表,再将当前字符指针加1,继续从头开始执行步骤2。如果不为0,取得该表项的具体数值,该数值是一个字符指针,其含义为数据块的某个字符的偏移量,然后转向步骤3。
3.将步骤2获得的哈希表项的具体数值,表示为一个待匹配字符指针,把当前字符指针指示的字符及所有后续字符,与待匹配字符指针指示的字符及所有后续字符进行字符串最大匹配,获得最大匹配长度。
然后以当前字符指针的值给步骤2指示的哈希表项赋值,取代原来的哈希表项的值。
然后再以字符串最大匹配长度的值进行比较判断,如果长度>=4,则表示匹配成功,转向步骤4,否则表示匹配不成功,转向步骤5。
4.如果匹配成功,则此时输出一个(原始码,复制码)序列。所谓原始码,即从原始码指针指示的字符,直到(当前字符指针-1)指示的字符为止,这一段字符串,原样输出到(原始码,复制码)的输出序列中,我们称这一段字符串为原始码。注意,如果(当前字符指针-1)<原始码指针,那么原始码的长度为0,原始码为空。而所谓复制码,其有2个元素,off和len,off即步骤3获得的待匹配字符串的偏移量,此处我们使用相对偏移量,那么可以给off赋值为(当前字符指针-待匹配字符串指针),len即为最大匹配长度。只要输出了off和len两个元素,那么在解压缩的时候,我们就可以根据off获得待匹配字符串的指针,再将该指针指示的字符作为起点,复制长度为len的字符串到当前字符指针所指示的空间,就可以获得原始的输入数据序列。因为这一段字符串在输出序列中并不存在,是需要解码然后再复制过来的,所以称这段字符串为复制码。复制码可以用两个元素off和len表示。
那么,我们的输出序列,就变成(若干个原始码,off,len)这样的形式。因为若干个原始码,其长度并不固定,我们无法解析第几个字节表示off和len的值,所以我们把输出序列转换一下,变成(off,lenC,lenL,若干个原始码)这样的形式。那么就便于以后的解压缩的处理了。这其中,lenC即是复制码的len元素,而lenL表示若干个原始码的长度。
输出(off,lenC,lenL,若干个原始码)序列以后,将原始码指针+lenC+lenL,重新赋值给原始码指针。再令当前字符指针等于重新赋值以后的原始码指针。
然后,判断当前字符指针是否小于等于数据块尾部偏移量,如果是,转向步骤2继续执行,否则转向步骤7。
5.如果匹配不成功,那么,令当前字符指针加1,然后转向步骤2继续执行。
6.执行本步骤表示对数据块的所有数据即将处理完毕。本步骤执行以下操作,输出(0,0,lenL,若干个原始码)到输出序列。其中的off和lenC元素的值都为0,表示只有原始码,没有复制码。lenL的值应该等于(数据块尾部偏移量-原始码指针+1),若干个原始码的序列应该是从原始码指针处开始,直到数据块最后一个字符处结束。然后继续执行步骤7。
7.对于输出的(off,lenC,lenL,若干个原始码)序列进行分区编码。
(1)分区编码的具体处理方法:
为了便于计算机快速处理数据,我们将(off,lenC,lenL,若干原始码)序列进行分区处理。
首先,连续存放的压缩码表现为如下形式:
压缩码序列1:
(off1,lenC1,lenL1)+(若干原始码1);(off2,lenC2,lenL2)+(若干原始码2);(off3,lenC3,lenL3)+(若干原始码3)...
可以看见压缩码序列1是连续存放,三元组(off,lenC1,lenL1)和(若干原始码)连续存放,不利于计算机进行快速处理。
本方法将压缩码序列1分区进行存放,具体方法如下:
压缩码序列1转化为压缩码序列2:
压缩码序列2:
分区a:
(off1,lenC1,lenL1);(off2,lenC2,lenL2);(off3,lenC3,lenL3)
分区b:
若干原始码1;若干原始码2;若干原始码3
整个压缩码序列2由分区a和分区b组成,分区a仅仅存放三元组序列,分区b单独存放原始码序列,通过分区编码,将不同属性的数据分区存放,便于计算机更加高效的处理数据。
(2)分区编码算法的进一步优化
经过上述步骤编码以后的压缩码序列,已经将不同属性数据分区存放,其中分区a存放三元组(off,lenC,lenL)序列,分区b存放原始码序列。为了进一步优化,可以将分区a进行二次压缩和二次编码,经过二次编码以后形成的数据可以再一次分区成d和c,即分区c和分区d为分区a的子分区,二者共同构成分区a。
(3)分区编码算法的数据结构具体定义及编码方法
分区编码算法的数据结构分为两种定义,分别定义了快速编码算法和紧凑编码算法。
由于输入数据流最大为64KB,所以(off,lenC,lenL)三元组中的off元素,最大为65535,不会超出2个字节表示范围。以下的数据结构定义都默认基于大端模式。
(3.1)
快速编码算法编码压缩步骤及结构定义:
定义临时区的单个三元组表项结构为4字节结构,其中off元素以2字节表示,lenC和lenL分别以1字节表示,整个临时区由若干个连续的三元组表项组成。
由于我们在前述的压缩过程中,在进行字符串匹配的时候,是至少要匹配4个字符才输出三元组序列,所以其中的lenC表示复制码长度,必然是大于等于4的,所以我们先进行一个临时变量的替换。
令T_lenC=lenC-4,用T_lenC替换掉三元组序列中的lenC元素,得到新的三元组序列(off,T_lenC,lenL)……以下我们进行编码时都是处理新的(off,T_lenC,lenL)三元组,而解码时,可以获得T_lenC的值,再+4即得到复制码的长度,即lenC的值。
现假设经过字符串匹配算法已经获得了三元组序列
(off1,T_lenC1,lenL1)(off2,T_lenC2,lenL2)(off3,T_lenC3,lenL3)...,对于一个三元组(off,T_lenC,lenL),其中的off元素经前述分块处理后,可以用2字节表示,不会出现溢出情况。而对于T_lenC,lenL元素,我们在临时区给其分配的结构为每个元素仅占1个字节,1个字节表示T_lenC和lenL最大值只能为255,而有可能出现T_lenC或者lenL的值大于255的情况,那么我们就需要对(off,T_lenC,lenL)进行一个预处理。
预处理:
如果T_lenC>=255且lenL<255,那可以令(off,T_lenC,lenL)转换为(off,255,lenL)+4字节的形式,后续追加的4字节表示(T_lenC-255)的值。
如果lenL>=255且T_lenC<255,那可以令(off,T_lenC,lenL)转换为(off,T_lenC,255)+4字节的形式,后续追加的4字节表示(lenL-255)的值。
如果T_lenC>=255且lenL>=255,那可以令(off,T_lenC,lenL)转换为(off,255,255)+4字节+4字节的形式,后续追加的第一个4字节表示(T_lenC-255)的值,第二个4字节表示(lenL-255)的值。
这样,经过预处理以后,三元组序列
(off1,T_lenC1,lenL1)(off2,T_lenC2,lenL2)(off3,T_lenC3,lenL3)...
可能转换成类似
(off1,T_lenC1,255)(lenL1-255)(off2,T_lenC2,lenL2)(off3,T_lenC3,lenL3)...的形式,
我们称其中混杂的(T_lenC-255)或者(lenL-255)这些项目为伪三元组,在整个序列中,可能没有伪三元组,也可能存在若干个伪三元组,但是不影响后续操作,因为三元组和伪三元组都是占用4个字节。我们将经过预处理以后的三元组序列存放在临时区。
对于临时区的三元组和伪三元组混合序列,现在进行二次压缩编码,将其分别生成c区编码和d区编码,c区和d区为a区的子分区,二者共同构成a区。
临时区二次压缩方法如下:
对于一个三元组(off,T_lenC,lenL)(或伪三元组,一样将其占用的4字节视作有3个元素),其长度为4字节,现将其用2个三元组表示,第一个三元组(a,b,c)为压缩前缀,第二个三元组(x,y,z)为短码本体。三元组(a,b,c)是一个固定长度编码,固定为a占用2位,b占用1位,c占用1位,所以三元组(a,b,c)一共占用4位。而三元组(x,y,z)为可变长编码,x可以为16位,12位,8位,4位长度,y可以为8位或4位长度,z可以为8位或4位长度,所以三元组(x,y,z)的长度可能在12位到32位之间变化。三元组(a,b,c)和三元组(x,y,z)的各个元素配对编码表示三元组(off,T_lenC,lenL)的三个元素。具体定义为: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)的三个元素的具体值,将其转换为(x,y,z)可变长度三元组和(a,b,c)三元组前缀,即
若off<16,那么用4位x表示off的值,且令a=0;
若16<=off<256,那么用8位x表示off的值,且令a=1;
若256<=off<4096,那么用12位x表示off的值,且令a=2;
若4096<=off<65535,那么用16位x表示off的值,且令a=3;
若T_lenC<16,那么用4位y表示T_lenC的值,且令b=0;
若T_lenC>=16,那么用8位y表示T_lenC的值,且令b=1;
若lenL<16,那么用4位z表示lenL的值,且令c=0;
若lenL>=16,那么用8位z表示lenL的值,且令c=1;
这样,就可以把三元组(off,T_lenC,lenL)转换为2个三元组(a,b,c)和(x,y,z),且大多数情况下,三元组(a,b,c)+三元组(x,y,z)的长度要小于三元组(off,T_lenC,lenL)的长度,这样就达到了压缩三元组(off,T_lenC,lenL)的目的。
在解压缩的时候,先取得三元组(a,b,c)的具体值,然后就能明确知道可变长度三元组(x,y,z)的准确长度,然后解析出x,y,z各个元素的准确值。需要注意的是,即使是对于伪三元组,也可以用(a,b,c)和(x,y,z)来进行二次压缩编码,因为伪三元组也是正好占用四个字节。
对所有的三元组(off,T_lenC,lenL)完成编码以后,形成了c区数据序列和d区数据序列,c区和d区共同构成a区。
需要注意的是,具体的计算机存储方式有大端模式和小端模式之分,因而在压缩数据处理完毕后,会生成一个标志来表示是大端模式还是小端模式,本方法此前的描述都是基于大端模式的。本方法也可以适用于小端模式,对于小端模式计算机,可以将数据结构前后颠倒,处理顺序也前后颠倒,即从分区末尾往前处理即可。
经过以上的二次压缩编码,分区a被分割成了c区和d区两个子分区,c区和d区的数据可以组合起来解析出完整的a区数据。
在二次压缩完成以后,生成分区c和分区d,并且一定要在a区头部生成若干个标志字节,记录分区c和分区d的长度、起始位置、大端模式、小端模式和其他属性。
(3.2)
紧凑编码算法压缩步骤及结构定义:
现假设经过字符串匹配算法已经获得了三元组序列
(off1,lenC1,lenL1)(off2,lenC2,lenL2)(off3,lenC3,lenL3)...
首先,对于一个三元组(off,lenC,lenL),其中的三个分量off,lenC,lenL的值,都可以用2个字节16位二进制数字表示,而不会出现溢出错误,因为经过前述分块处理后,偏移量,复制码长度和原始码长度都小于65535。
本方法采用紧凑格式将三元组序列
(off1,lenC1,lenL1)(off2,lenC2,lenL2)(off3,lenC3,lenL3)...
编码成c区编码和d区编码,c区和d区为a区的子分区,c区和d区共同构成a区。
由于我们在前述的压缩过程中,在进行字符串匹配的时候,是至少要匹配4个字符才输出三元组序列,所以其中的lenC表示复制码长度,必然是大于等于4的,所以我们先进行一个临时变量的替换。
令T_lenC=lenC-4,用T_lenC替换掉三元组序列中的lenC元素,得到新的三元组序列(off,T_lenC,lenL)……以下我们进行编码时都是处理新的(off,T_lenC,lenL)三元组,而解码时,可以获得T_lenC的值,再+4即得到复制码的长度,即lenC的值。
对于三元组(off,T_lenC,lenL),我们将其按照如下规则进行编码:
首先,判断输入数据流的长度是否小于等于8192字节,如果小于等于8192字节,那么三元组中的off分量最大不会超过8192,因而可以用13位二进制数表示off分量,不会出现溢出错误。
当输入数据流长度小于等于8192字节时,按照如下规则进行编码,否则按照后文所述的数据块大于8KB编码规则进行编码。
数据块不大于8KB编码规则:
先声明以下的符号+,不代表数学的求和运算,仅仅表示把+号前后的两个二进制数字或符号串连在一起。
a.若lenL<3,则lenL可以用2位二进制数表示,再加一位前缀位,将其编码为0XX(此处和以下(标志位+XX)的格式均表示n位的二进制数字),并存放到c区。
b.若18>=lenL>=3,则15>=(lenL-3)>=0,那么可以用4位二进制表示(lenL-3)的值,再加一位前缀位,为和a.条款区别,此处令前缀位为1,即这时可以将lenL分量编码为1XXXX(5位二进制数),并将其存放到c区。
c.若lenL>18,则可以用16位二进制数表示lenL的值,我们将16位二进制数的lenL的值存放到d区,并生成一个特殊标志011(3位二进制数),存放到c区。
d.若T_lenC<4且off<512,则T_lenC可用2位二进制数表示,off可用9位二进制数表示,再加上2位前缀位,于是我们将(off,T_lenC)编码为00+XX(2位二进制数的T_lenC的值)+XXXXXXXXX(9位二进制数的off的值),并将其存放到c区。
e.若T_lenC<4且512<=off<8192,则T_lenC可用2位二进制数表示,off可用13位二进制数表示,再加上2位前缀位,为了表示区别,此处令前缀=01(2位二进制数)。于是我们将(off,T_lenC)编码为01+XX(2位二进制数的T_lenC的值)+XXXXXXXXXXXXX(13位二进制数的off的值),并将其存放到c区。
f.若4<=T_lenC<19且off<512,则(T_lenC-4)可用4位二进制数表示,off可用9位二进制数表示,再加上2位前缀位,为了表示区别,此处令前缀=10(2位二进制数)。于是我们将(off,T_lenC)编码为10+XXXX(4位二进制数的(T_lenC-4)的值)+XXXXXXXXX(9位二进制数的off的值),并将其存放到c区。
g.若4<=T_lenC<19且512<=off<8192,则(T_lenC-4)可用4位二进制数表示,off可用13位二进制数表示,再加上2位前缀位,为了表示区别,此处令前缀=11(2位二进制数)。于是我们将(off,T_lenC)编码为11+XXXX(4位二进制数的(T_lenC-4)的值)+XXXXXXXXXXXXX(13位二进制数的off的值),并将其存放到c区。
h.若T_lenC>=19且off<512,则T_lenC可用16位二进制数表示,off可用9位二进制数表示,再加上2位前缀位,此处令前缀=10(2位二进制数)。于是我们将(off,T_lenC)编码为10+1111(4位二进制数)+XXXXXXXXX(9位二进制数的off的值),并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区。
i.若T_lenC>=19且512<=off<8192,则T_lenC可用16位二进制数表示,off可用13位二进制数表示,再加上2位前缀位,此处令前缀=11(2位二进制数)。于是我们将(off,T_lenC)编码为11+1111(4位二进制数)+XXXXXXXXXXXXX(13位二进制数的off的值),并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区。
数据块大于8KB编码规则:
以下编码规则适用于输入数据流长度大于8192的情况。
a.若lenL<3,则lenL可以用2位二进制数表示,再加一位前缀位,将其编码为0XX(此处和以下(标志位+XX)的格式均表示n位的二进制数字),并存放到c区。
b.若18>=lenL>=3,则15>=(lenL-3)>=0,那么可以用4位二进制表示(lenL-3)的值,再加一位前缀位,为和a.条款区别,此处令前缀位为1,即这时可以将lenL分量编码为1XXXX(5位二进制数),并将其存放到c区。
c.若lenL>18,则可以用16位二进制数表示lenL的值,我们将16位二进制数的lenL的值存放到d区,并生成一个特殊标志011(3位二进制数),存放到c区。
d.若T_lenC<4且off<512,则T_lenC可用2位二进制数表示,off可用9位二进制数表示,再加上2位前缀位,于是我们将(off,T_lenC)编码为00+XX(2位二进制数的T_lenC的值)+XXXXXXXXX(9位二进制数的off的值),并将其存放到c区。
e.若T_lenC<4且512<=off<8192,则T_lenC可用2位二进制数表示,off可用13位二进制数表示,再加上2位前缀位,为了表示区别,此处令前缀=01(2位二进制数)。于是我们将(off,T_lenC)编码为01+XX(2位二进制数的T_lenC的值)+XXXXXXXXXXXXX(13位二进制数的off的值),并将其存放到c区。
f.若4<=T_lenC<19且off<512,则(T_lenC-4)可用4位二进制数表示,off可用9位二进制数表示,再加上3位前缀位,为了表示区别,此处令前缀=100(3位二进制数)。于是我们将(off,T_lenC)编码为100+XXXX(4位二进制数的(T_lenC-4)的值)+XXXXXXXXX(9位二进制数的off的值),并将其存放到c区。
g.若4<=T_lenC<19且512<=off<8192,则(T_lenC-4)可用4位二进制数表示,off可用13位二进制数表示,再加上2位前缀位,为了表示区别,此处令前缀=11(2位二进制数)。于是我们将(off,T_lenC)编码为11+XXXX(4位二进制数的(T_lenC-4)的值)+XXXXXXXXXXXXX(13位二进制数的off的值),并将其存放到c区。
h.若T_lenC<15且off>=8192,则T_lenC可用4位二进制数表示,off可用16位二进制数表示,再加上3位前缀位,为了表示区别,此处令前缀=101(3位二进制数)。于是我们将(off,T_lenC)编码为101+XXXX(4位二进制数的T_lenC的值)+XXXXXXXXXXXXXXXX(16位二进制数的off的值),并将其存放到c区。
i.若T_lenC>=19且off<512,则T_lenC可用16位二进制数表示,off可用9位二进制数表示,再加上3位前缀位,此处令前缀=100(3位二进制数)。于是我们将(off,T_lenC)编码为100+1111(4位二进制数)+XXXXXXXXX(9位二进制数的off的值),并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区。
j.若T_lenC>=19且512<=off<8192,则T_lenC可用16位二进制数表示,off可用13位二进制数表示,再加上2位前缀位,此处令前缀=11(2位二进制数)。于是我们将(off,T_lenC)编码为11+1111(4位二进制数)+XXXXXXXXXXXXX(13位二进制数的off的值),并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区。
k.若T_lenC>=15且off>=8192,则T_lenC可用16位二进制数表示,off可用16位二进制数表示,再加上3位前缀位,此处令前缀=101(3位二进制数)。于是我们将(off,T_lenC)编码为101+1111(4位二进制数)+XXXXXXXXXXXXXXXX(16位二进制数的off的值),并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区。
对所有的三元组(off,T_lenC,lenL)完成编码以后,形成了c区数据序列和d区数据序列,c区和d区共同构成a区。
需要注意的是,具体的计算机存储方式有大端模式和小端模式之分,因而在压缩数据处理完毕后,会生成一个标志来表示是大端模式还是小端模式,本方法此前的描述都是基于大端模式的。本方法也可以适用于小端模式,对于小端模式计算机,可以把编码后的数据序列从尾部往前面倒序存放,处理顺序也前后颠倒,即从分区末尾往前处理即可。
经过以上的二次压缩编码,分区a被分割成了c区和d区两个子分区,c区和d区的数据可以组合起来解析出完整的a区数据。
在二次压缩完成以后,生成分区c和分区d,并且一定要在a区头部生成若干个标志字节,记录分区c和分区d的长度、起始位置、8K标志、大端模式、小端模式和其他属性。
三元组(off,T_lenC,lenL)序列经过以上编码规则进行编码以后,生成了a区数据。然后,我们将a区和b区组合在一起,并且在头部生成若干的标志字节,记录分区a和分区b的长度、起始位置、压缩模式和其他一些属性。这样就完成了对输入数据流的整个压缩处理过程。
解压缩过程
根据本方法独特的编码方式,我们采用独特的解压缩方式处理数据,并且能够获得极快的解压缩速度。
(1)
快速编码算法解压缩步骤及相关数据结构:
定义三元组(off,lenC,lenL)临时区的单个三元组表项结构为6字节结构,第1第2字节为off,第3第4字节为lenC,第5第6字节为lenL。
预先在临时区分配足够多的三元组6字节结构,形成三元组6字节结构列表。
对于a区数据,根据大端模式还是小端模式的标志,决定从头至尾按正向顺序解析(off,lenC,lenL)三元组,还是从尾部往前面按反向顺序解析(off,lenC,lenL)三元组。
解析三元组(off,lenC,lenL)的具体步骤如下:
a区由c区和d区数据组成,取c取数据,解析前缀三元组(a,b,c),前缀三元组是固定格式,为4位二进制数,其中a占用2位,b占用1位,c占用1位,根据a,b,c的值,可以确定其在d区对应的(x,y,z)三元组的长度,并正确解析出x,y,z的值。
判断y的值是否等于255,若不是,则跳到下一步;若是,则继续解析下一个前缀三元组(a,b,c),并且根据a,b,c的具体值解析出下一个(x,y,z)的值,但是此时,解析出的下一个三元组(x,y,z)是一个伪三元组,由其3个元素x,y,z组成一个4字节的数值,把这个数值+255赋予上一个(x,y,z)真三元组中的y元素。
判断z的值是否等于255,若不是,则跳到下一步;若是,则继续解析下一个前缀三元组(a,b,c),并且根据a,b,c的具体值解析出下一个(x,y,z)的值,但是此时,解析出的下一个三元组(x,y,z)是一个伪三元组,由其3个元素x,y,z组成一个4字节的数值,把这个数值+255赋予上一个(x,y,z)真三元组中的z元素。
然后将x,y,z的值填充到三元组(off,lenC,lenL)的临时区6字节结构中。因为每个元素都用2个字节表示,所以不会出现溢出错误。
然后继续解析余下的c区和d区数据,直到全部解析完成,将在三元组(off,lenC,lenL)临时区填充若干个三元组(off,lenC,lenL)6字节结构,形成完整的三元组(off,lenC,lenL)6字节结构列表。
此时,我们获得的三元组(off,lenC,lenL)6字节结构列表中的lenC元素,是我们在编码时的T_lenC的值,即真实的复制码长度-4,这时,我们令C_lenC=lenC+4,再把C_lenC填充到三元组(off,lenC,lenL)6字节结构列表中,取代原来的lenC元素,这时我们的三元组(off,C_lenC,lenL)6字节结构列表中,lenC已经是修正后的C_lenC,即是复制码的正确的长度。
然后,根据三元组6字节结构列表,将原始码数据从b区复制到输出空间。
复制步骤如下:
取第一个三元组(off,C_lenC,lenL),将b区原始码从第一个原始码开始,复制lenL的长度到输出空间。
然后根据off计算得到复制码首字符在输出空间的偏移,根据C_lenC得到应该复制的长度,并根据这两个参数把复制码从前面的输出空间中复制到当前输出位置。
然后取第二个三元组(off2,C_lenC2,lenL2),继续如此操作,直至复制全部完成。则整个解压缩过程完成。
(2)
紧凑编码算法解压缩步骤及相关数据结构:
定义三元组(off,lenC,lenL)临时区的单个三元组表项结构为6字节结构,第1第2字节为off,第3第4字节为lenC,第5第6字节为lenL。
预先在临时区分配足够多的三元组6字节结构,形成三元组6字节结构列表。
对于a区数据,根据大端模式还是小端模式的标志,决定从头至尾按正向顺序解析(off,lenC,lenL)三元组,还是从尾部往前面按反向顺序解析(off,lenC,lenL)三元组。
解析三元组(off,lenC,lenL)的具体步骤如下:
a区由c区和d区数据组成,取c区数据,根据编码定义的前缀,解析出(off,lenC,lenL)三元组的具体数值,必要时,取d区的数据共同完成(off,lenC,lenL)的具体值的解析,然后将解析得到的(off,lenC,lenL)的值填充到三元组(off,lenC,lenL)的临时区6字节结构中。因为每个元素都用2个字节表示,所以不会出现溢出错误。
然后继续解析余下的c区和d区数据,直到全部解析完成,将在三元组(off,lenC,lenL)临时区填充若干个三元组(off,lenC,lenL)6字节结构,形成完整的三元组(off,lenC,lenL)6字节结构列表。
此时,我们获得的三元组(off,lenC,lenL)6字节结构列表中的lenC元素,是我们在编码时的T_lenC的值,即真实的复制码长度-4,这时,我们令C_lenC=lenC+4,再把C_lenC填充到三元组(off,lenC,lenL)6字节结构列表中,取代原来的lenC元素,这时我们的三元组(off,C_lenC,lenL)6字节结构列表中,C_lenC已经是修正后的C_lenC,即是复制码的正确的长度。
然后,根据三元组6字节结构列表,将原始码数据从b区复制到输出空间。
复制步骤如下:
取第一个三元组(off,C_lenC,lenL),将b区原始码从第一个原始码开始,复制lenL的长度到输出空间。
然后根据off计算得到复制码首字符在输出空间的偏移,根据C_lenC得到应该复制的长度,并根据这两个参数把复制码从前面的输出空间中复制到当前输出位置。
然后取第二个三元组(off2,C_lenC2,lenL2),继续如此操作,直至复制全部完成。则整个解压缩过程完成。
Claims (6)
1.一种基于LZ77算法的分区编码压缩方法,其特征在于,包括以下步骤:
压缩步骤:
步骤1:采用哈希表获得待压缩数据的压缩序列:(off,lenC,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)重复操作,直至复制全部完成,即完成整个解压缩过程。
2.根据权利要求1所述的一种基于LZ77算法的分区编码压缩方法,其特征在于,所述的步骤1中采用哈希表获得待压缩数据的压缩序列(off,lenC,lenL,原始码)序列的步骤包括:
步骤一:定义用于组成哈希表并存储字符指针的哈希表项,并将所有哈希表项的值初始化为0,同时把当前字符指针和原始码指针均设为0;
步骤二:判断当前字符指针+3的值是否小于数据块尾部偏移量:
如果是,则取当前字符指针指向的字符及其后连续的3个字符,作为一个32位二进制数计算哈希值,用得到的哈希值表示哈希表项的序号,查询该序号下的哈希表项的值,如果为0,则将当前字符指针存入哈希表,再将当前字符指针加1,从头开始执行步骤二,如果不为0,取得该表项的具体数值,然后转向步骤三;
否则转向步骤六;
步骤三:将步骤二获得的哈希表项的具体数值,表示为一个待匹配字符指针,把当前字符指针指示的字符及所有后续字符,与待匹配字符指针指示的字符及所有后续字符进行字符串最大匹配,获得最大匹配长度。
然后以当前字符指针的值给步骤二指示的哈希表项赋值,取代原来的哈希表项的值,
然后再以字符串最大匹配长度的值进行比较判断,如果长度>=4,则表示匹配成功,转向步骤四,否则表示匹配不成功,转向步骤五;
步骤四:输出(off,lenC,lenL,原始码)序列,其中原始码是从原始码指针指示的字符,直到当前字符指针-1指示的字符为止的这一段字符串,off是步骤三中获得的待匹配字符串的相对偏移量,即当前字符指针-待匹配字符串指针,lenC是步骤三中得到的字符串最大匹配长度,lenL是原始码的长度;然后将原始码指针+lenC+lenL,重新赋值给原始码指针,再令当前字符指针等于重新赋值以后的原始码指针;
然后,判断当前字符指针是否小于等于数据块尾部偏移量,如果是,转向步骤二继续执行,否则转向压缩步骤的步骤2;
步骤五:令当前字符指针加1,然后转向步骤二;
步骤六:输出(0,0,lenL,原始码)到输出序列,其中lenL的值为数据块尾部偏移量-原始码指针+1,原始码的序列是从原始码指针处开始,直到数据块最后一个字符处结束,然后执行压缩步骤的步骤2。
3.根据权利要求1所述的一种基于LZ77算法的分区编码压缩方法,其特征在于,在执行所述的压缩步骤的步骤1之前,首先将长度大于65536字节的输入数据流分割为若干个连续的长度为65536字节的数据块,且最后一个数据块的长度小于等于65536字节,然后对于每个数据块按顺序进行压缩处理,一次压缩一个数据块。
4.根据权利要求1所述的一种基于LZ77算法的分区编码压缩方法,其特征在于,在执行压缩步骤的步骤3时,首先将(off,T_lenC,lenL,原始码)序列进行分区处理时,具体的处理步骤为:
将顺序存放的(off,T_lenC,lenL,原始码)序列分离为三元组(off,T_lenC,lenL)序列和原始码序列,并且不再将其连续存放为一个序列,而是单独将原始码序列存放在b区,a区则存放三元组(off,T_lenC,lenL)序列经过编码以后生成的数据。
5.根据权利要求1所述的一种基于LZ77算法的分区编码压缩方法,其特征在于,在执行压缩步骤的步骤4时,预处理的步骤包括:
如果T_lenC>=255且lenL<255,则令(off,T_lenC,lenL)转换为(off,255,lenL)+4字节的形式,后续追加的4字节表示(T_lenC-255)的值。
如果lenL>=255且T_lenC<255,则令(off,T_lenC,lenL)转换为(off,T_lenC,255)+4字节的形式,后续追加的4字节表示(lenL-255)的值。
如果T_lenC>=255且lenL>=255,则令(off,T_lenC,lenL)转换为(off,255,255)+4字节+4字节的形式,后续追加的第一个4字节表示(T_lenC-255)的值,第二个4字节表示(lenL-255)的值。
6.根据权利要求1所述的一种基于LZ77算法的分区编码压缩方法,其特征在于,在执行解压步骤的步骤2)时,需判断y的值是否等于255,若不是,则跳到下一步;若是,则继续解析下一个前缀三元组(a,b,c),并且根据a,b,c的具体值解析出下一个(x,y,z)的值,但是此时,解析出的下一个三元组(x,y,z)是一个伪三元组,由其3个元素x,y,z组成一个4字节的数值,把这个数值+255赋予上一个(x,y,z)真三元组中的y元素;
判断z的值是否等于255,若不是,则跳到下一步;若是,则继续解析下一个前缀三元组(a,b,c),并且根据a,b,c的具体值解析出下一个(x,y,z)的值,但是此时,解析出的下一个三元组(x,y,z)是一个伪三元组,由其3个元素x,y,z组成一个4字节的数值,把这个数值+255赋予上一个(x,y,z)真三元组中的z元素;
然后将x,y,z的值填充到三元组(off,lenC,lenL)的临时区6字节结构中;
在编码时,如果遇到伪三元组,视同真三元组分离出三个元素进行处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510718683.9A CN105610447B (zh) | 2015-10-29 | 2015-10-29 | 基于lz77算法的分区编码压缩方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510718683.9A CN105610447B (zh) | 2015-10-29 | 2015-10-29 | 基于lz77算法的分区编码压缩方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105610447A true CN105610447A (zh) | 2016-05-25 |
CN105610447B CN105610447B (zh) | 2018-06-19 |
Family
ID=55990023
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510718683.9A Active CN105610447B (zh) | 2015-10-29 | 2015-10-29 | 基于lz77算法的分区编码压缩方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105610447B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106971528A (zh) * | 2017-03-31 | 2017-07-21 | 上海智觅智能科技有限公司 | 一种压缩红外空调遥控码库的算法 |
CN107688439A (zh) * | 2017-08-15 | 2018-02-13 | 深圳前海信息技术有限公司 | 基于Deflate的无关联压缩块的生成方法及装置 |
CN107888197A (zh) * | 2017-10-31 | 2018-04-06 | 华为技术有限公司 | 一种数据压缩方法和装置 |
CN108287877A (zh) * | 2018-01-02 | 2018-07-17 | 西安交通大学 | 一种rib渲染压缩文件fpga压缩/解压缩系统及硬件解压方法 |
CN109104199A (zh) * | 2018-08-29 | 2018-12-28 | 重庆物奇科技有限公司 | 基于霍夫曼编码的编码方法、译码方法及应用 |
CN109558156A (zh) * | 2019-01-15 | 2019-04-02 | 重庆德科电子仪表有限公司 | 一种汽车仪表升级优化方法 |
CN117097442A (zh) * | 2023-10-19 | 2023-11-21 | 深圳大普微电子股份有限公司 | 一种数据解码方法、系统、设备及计算机可读存储介质 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109872522B (zh) * | 2019-03-25 | 2021-01-01 | 河北棣烨信息技术有限公司 | 基于样本索引对红外码解压缩的算法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050179569A1 (en) * | 2002-05-09 | 2005-08-18 | Gordon Cockburn | Method and arrangement for data compression according to the lz77 algorithm |
CN103023509A (zh) * | 2012-11-14 | 2013-04-03 | 无锡芯响电子科技有限公司 | 一种硬件lz77压缩实现系统及其实现方法 |
CN103023511A (zh) * | 2012-12-05 | 2013-04-03 | 云之朗科技有限公司 | 一种应用的压缩编码方法及装置 |
CN103095305A (zh) * | 2013-01-06 | 2013-05-08 | 中国科学院计算技术研究所 | 一种硬件lz77的压缩实现系统及方法 |
-
2015
- 2015-10-29 CN CN201510718683.9A patent/CN105610447B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050179569A1 (en) * | 2002-05-09 | 2005-08-18 | Gordon Cockburn | Method and arrangement for data compression according to the lz77 algorithm |
CN103023509A (zh) * | 2012-11-14 | 2013-04-03 | 无锡芯响电子科技有限公司 | 一种硬件lz77压缩实现系统及其实现方法 |
CN103023511A (zh) * | 2012-12-05 | 2013-04-03 | 云之朗科技有限公司 | 一种应用的压缩编码方法及装置 |
CN103095305A (zh) * | 2013-01-06 | 2013-05-08 | 中国科学院计算技术研究所 | 一种硬件lz77的压缩实现系统及方法 |
Non-Patent Citations (2)
Title |
---|
吴湘华: "最大窗口值对LZ77算法压缩效率的影响研究", 《黑龙江科技信息》 * |
高志坚等: "LZ77压缩算法及其派生算法探究", 《西昌学院学报(自然科学版)》 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106971528A (zh) * | 2017-03-31 | 2017-07-21 | 上海智觅智能科技有限公司 | 一种压缩红外空调遥控码库的算法 |
CN107688439A (zh) * | 2017-08-15 | 2018-02-13 | 深圳前海信息技术有限公司 | 基于Deflate的无关联压缩块的生成方法及装置 |
CN107888197A (zh) * | 2017-10-31 | 2018-04-06 | 华为技术有限公司 | 一种数据压缩方法和装置 |
CN107888197B (zh) * | 2017-10-31 | 2021-08-13 | 华为技术有限公司 | 一种数据压缩方法和装置 |
CN108287877A (zh) * | 2018-01-02 | 2018-07-17 | 西安交通大学 | 一种rib渲染压缩文件fpga压缩/解压缩系统及硬件解压方法 |
CN108287877B (zh) * | 2018-01-02 | 2020-10-27 | 西安交通大学 | 一种rib渲染压缩文件fpga压缩/解压缩系统及硬件解压方法 |
CN109104199A (zh) * | 2018-08-29 | 2018-12-28 | 重庆物奇科技有限公司 | 基于霍夫曼编码的编码方法、译码方法及应用 |
CN109558156A (zh) * | 2019-01-15 | 2019-04-02 | 重庆德科电子仪表有限公司 | 一种汽车仪表升级优化方法 |
CN109558156B (zh) * | 2019-01-15 | 2021-07-27 | 重庆德科电子仪表有限公司 | 一种汽车仪表升级优化方法 |
CN117097442A (zh) * | 2023-10-19 | 2023-11-21 | 深圳大普微电子股份有限公司 | 一种数据解码方法、系统、设备及计算机可读存储介质 |
CN117097442B (zh) * | 2023-10-19 | 2024-01-16 | 深圳大普微电子股份有限公司 | 一种数据解码方法、系统、设备及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN105610447B (zh) | 2018-06-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105610447A (zh) | 基于lz77算法的分区编码压缩方法 | |
CN114244373B (zh) | Lz系列压缩算法编解码速度优化方法 | |
CN100553152C (zh) | 基于cabac的编码方法和设备及解码方法和设备 | |
US7688233B2 (en) | Compression for deflate algorithm | |
JP5251799B2 (ja) | データ処理装置およびデータ処理方法 | |
CN102244518A (zh) | 并行解压缩的硬件实现的系统及方法 | |
CN110060158A (zh) | 基于变长编码的智能合约执行方法和装置 | |
WO2019080670A1 (zh) | 基因测序数据压缩解压方法、系统及计算机可读介质 | |
CN108391129A (zh) | 数据编码方法及装置 | |
JPH05241777A (ja) | データ圧縮方式 | |
CN110602498A (zh) | 一种自适应有限状态熵编码的方法 | |
US6798362B2 (en) | Polynomial-time, sequential, adaptive system and method for lossy data compression | |
CN104052749A (zh) | 一种链路层协议数据类型识别的方法 | |
CN107911196B (zh) | 一种雷达航迹报文传输方法 | |
US9235610B2 (en) | Short string compression | |
Barmpalias et al. | Compression of data streams down to their information content | |
CN111384962B (zh) | 数据压缩解压装置和数据压缩方法 | |
CN107896136B (zh) | 一种雷达航迹报文编码方法 | |
CN111384963B (zh) | 数据压缩解压装置和数据解压方法 | |
CN114519346A (zh) | 基于语言模型的译码处理方法、装置、设备和介质 | |
CN111384964B (zh) | 数据压缩解压装置和数据压缩方法 | |
CN113938273B (zh) | 可对抗量并行计算攻击的对称加密方法以及系统 | |
US11640265B2 (en) | Apparatus for processing received data | |
US12019921B2 (en) | Apparatus for processing received data | |
Gray et al. | Distortion and Entropy |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |