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

文档序号:9846361阅读:来源:国知局
入数据流的整个压缩处理过程。
[0196]解压缩过程
[0197]根据本方法独特的编码方式,我们采用独特的解压缩方式处理数据,并且能够获得极快的解压缩速度。
[0198](I)
[0199]快速编码算法解压缩步骤及相关数据结构:
[0200]定义三元组(off, IenC, IenL)临时区的单个三元组表项结构为6字节结构,第I第2字节为off,第3第4字节为lenC,第5第6字节为lenL。
[0201]预先在临时区分配足够多的三元组6字节结构,形成三元组6字节结构列表。
[0202]对于a区数据,根据大端模式还是小端模式的标志,决定从头至尾按正向顺序解析(off, lenC, IenL)三元组,还是从尾部往前面按反向顺序解析(off, lenC, IenL)三元组。
[0203]解析三元组(off, lenC, IenL)的具体步骤如下:
[0204]a区由c区和d区数据组成,取c取数据,解析前缀三元组(a,b, c),前缀三元组是固定格式,为4位二进制数,其中a占用2位,b占用I位,c占用I位,根据a,b, c的值,可以确定其在d区对应的(X,y, z)三元组的长度,并正确解析出X,y, z的值。
[0205]判断y的值是否等于255,若不是,则跳到下一步;若是,则继续解析下一个前缀三元组(a, b, c),并且根据a, b, c的具体值解析出下一个(x, y, z)的值,但是此时,解析出的下一个三元组(X,y, z)是一个伪三元组,由其3个元素X,y, z组成一个4字节的数值,把这个数值+255赋予上一个(X,y, z)真三元组中的y元素。
[0206]判断z的值是否等于255,若不是,则跳到下一步;若是,则继续解析下一个前缀三元组(a, b, c),并且根据a, b, c的具体值解析出下一个(x, y, z)的值,但是此时,解析出的下一个三元组(X,y, z)是一个伪三元组,由其3个元素X,y, z组成一个4字节的数值,把这个数值+255赋予上一个(X,y, z)真三元组中的z元素。
[0207]然后将X,y, z的值填充到三元组(off,lenC, IenL)的临时区6字节结构中。因为每个元素都用2个字节表示,所以不会出现溢出错误。
[0208]然后继续解析余下的c区和d区数据,直到全部解析完成,将在三元组(off, lenC, IenL)临时区填充若干个三元组(off, lenC, IenL) 6字节结构,形成完整的三元组(off, lenC, IenL)6字节结构列表。
[0209]此时,我们获得的三元组(off,lenC, IenL) 6字节结构列表中的IenC元素,是我们在编码时的T_lenC的值,即真实的复制码长度_4,这时,我们令C_lenC = lenC+4,再把C_IenC填充到三元组(off, lenC, IenL) 6字节结构列表中,取代原来的IenC元素,这时我们的三元组(off, C_lenC, lenL) 6字节结构列表中,IenC已经是修正后的C_lenC,即是复制码的正确的长度。
[0210]然后,根据三元组6字节结构列表,将原始码数据从b区复制到输出空间。
[0211]复制步骤如下:
[0212]取第一个三元组(off, C_lenC, lenL),将b区原始码从第一个原始码开始,复制IenL的长度到输出空间。
[0213]然后根据off计算得到复制码首字符在输出空间的偏移,根据C_lenC得到应该复制的长度,并根据这两个参数把复制码从前面的输出空间中复制到当前输出位置。
[0214]然后取第二个三元组(off2,C_lenC2, lenL2),继续如此操作,直至复制全部完成。则整个解压缩过程完成。
[0215](2)
[0216]紧凑编码算法解压缩步骤及相关数据结构:
[0217]定义三元组(off, lenC, lenL)临时区的单个三元组表项结构为6字节结构,第I第2字节为off,第3第4字节为lenC,第5第6字节为lenL。
[0218]预先在临时区分配足够多的三元组6字节结构,形成三元组6字节结构列表。
[0219]对于a区数据,根据大端模式还是小端模式的标志,决定从头至尾按正向顺序解析(off, lenC, lenL)三元组,还是从尾部往前面按反向顺序解析(off, lenC, lenL)三元组。
[0220]解析三元组(off, lenC, lenL)的具体步骤如下:
[0221]a区由c区和d区数据组成,取c区数据,根据编码定义的前缀,解析出(off, lenC, lenL)三元组的具体数值,必要时,取d区的数据共同完成(off, lenC, lenL)的具体值的解析,然后将解析得到的(off, lenC, IenL)的值填充到三元组(off, lenC, IenL)的临时区6字节结构中。因为每个元素都用2个字节表示,所以不会出现溢出错误。
[0222]然后继续解析余下的c区和d区数据,直到全部解析完成,将在三元组(off, lenC, lenL)临时区填充若干个三元组(off, lenC, lenL) 6字节结构,形成完整的三元组(off, lenC, lenL)6字节结构列表。
[0223]此时,我们获得的三元组(off,lenC, lenL) 6字节结构列表中的IenC元素,是我们在编码时的T_lenC的值,即真实的复制码长度_4,这时,我们令C_lenC = lenC+4,再把C_IenC填充到三元组(off, lenC, lenL) 6字节结构列表中,取代原来的IenC元素,这时我们的三元组(off, C_lenC, lenL) 6字节结构列表中,C_lenC已经是修正后的C_lenC,即是复制码的正确的长度。
[0224]然后,根据三元组6字节结构列表,将原始码数据从b区复制到输出空间。
[0225]复制步骤如下:
[0226]取第一个三元组(off, C_lenC, lenL),将b区原始码从第一个原始码开始,复制IenL的长度到输出空间。
[0227]然后根据off计算得到复制码首字符在输出空间的偏移,根据C_lenC得到应该复制的长度,并根据这两个参数把复制码从前面的输出空间中复制到当前输出位置。
[0228]然后取第二个三元组(off2,C_lenC2, lenL2),继续如此操作,直至复制全部完成。则整个解压缩过程完成。
【主权项】
1.一种基于LZ77算法的分区编码压缩方法,其特征在于,包括以下步骤: 压缩步骤: 步骤1:采用哈希表获得待压缩数据的压缩序列:(off,lenC,lenL,原始码)序列; 步骤2:对于(off,lenC,lenL,原始码)序列进行临时变量替换,令T_lenC = lenC-4,替换原序列的IenC分量,生成新的序列(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,IenL)临时区的单个三元组表项结构定义为4字节结构,其中off元素以2字节表示,T_lenC和IenL分别以I字节表示,整个临时区由若干个连续的三元组表项组成,然后对所有的(off,T_lenC,IenL)三元组进行预处理,以消除T_lenC和IenL的值超过255的情况,然后将预处理以后的三元组序列(off,T_lenC,IenL)存放在临时区,对临时区数据进行二次压缩编码,具体编码规则如下:将每一个(off,T_lenC,lenL)三元组表示为压缩前缀三元组(a,h, 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,IenL)三元组表示为压缩前缀三元组(a,b,c)和短码本体三元组(x,y,z)后,将前缀三元组(a,b,c)存放在c区,将短码本体三元组(X,1,z)存放在d区; 对所有的(off,T_lenC,lenL)三元组完成编码后,形成两个存放数据的分区c区和d区,这两个分区构成原有的用于存放三元组序列的分区a区,完成编码,跳至步骤8 ; 步骤5:紧凑编码方法, 首先判断输入数据流的长度,小于等于8192字节时执行步骤6,否则执行步骤7 ; 步骤6:对于三元组(off,T_lenC,lenL), a.若lenL〈3,则IenL用2位二进制数表示,再加一位前缀位,将其编码为0ΧΧ,并存放到c区; b.若18>= lenL> = 3,用4位二进制表示(lenL_3)的值,再加一位前缀位1,编码为1XXXX,并存放到c区; c.若lenL>18,用16位二进制数表示IenL的值,将值存放到d区,并生成一个特殊标志011的3位二进制数,存放到c区; d.若T_lenC〈4且off〈512,则T_lenC用2位二进制数表示,off可用9位二进制数表示,再加上2位前缀位00,将(off,T_lenC)编码为00+ΧΧ以及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区; 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区; 完成编码,跳至步骤8; 步骤7: a.若IenLdljIenL用2位二进制数表示,再加一位前缀位,编码为0ΧΧ,并存放到c区; b.若18>= lenL> = 3,用4位二进制表示(lenL_3)的值,再加一位前缀位1,将IenL分量编码为ιχχχ
当前第5页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1