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

文档序号:9846361阅读:来源:国知局
.2)
[0155]紧凑编码算法压缩步骤及结构定义:
[0156]现假设经过字符串匹配算法已经获得了三元组序列
[0157](offl, IenCl, IenLl) (off2, lenC2, lenL2) (off3, lenC3, lenL3)...
[0158]首先,对于一个三元组(off, IenC, lenL),其中的三个分量off,IenC, IenL的值,都可以用2个字节16位二进制数字表示,而不会出现溢出错误,因为经过前述分块处理后,偏移量,复制码长度和原始码长度都小于65535。
[0159]本方法采用紧凑格式将三元组序列
[0160](offl, IenCl, IenLl) (off2, lenC2, lenL2) (off3, lenC3, lenL3)...
[0161]编码成c区编码和d区编码,c区和d区为a区的子分区,c区和d区共同构成a区。
[0162]由于我们在前述的压缩过程中,在进行字符串匹配的时候,是至少要匹配4个字符才输出三元组序列,所以其中的IenC表示复制码长度,必然是大于等于4的,所以我们先进行一个临时变量的替换。
[0163]$T_lenC = lenC-4,用T_lenC替换掉三元组序列中的IenC元素,得到新的三元组序列(off,T_lenC,IenL)……以下我们进行编码时都是处理新的(off,T_lenC,IenL)三元组,而解码时,可以获得T_lenC的值,再+4即得到复制码的长度,即IenC的值。
[0164]对于三元组(off,T_lenC, IenL),我们将其按照如下规则进行编码:
[0165]首先,判断输入数据流的长度是否小于等于8192字节,如果小于等于8192字节,那么三元组中的off分量最大不会超过8192,因而可以用13位二进制数表示off分量,不会出现溢出错误。
[0166]当输入数据流长度小于等于8192字节时,按照如下规则进行编码,否则按照后文所述的数据块大于8KB编码规则进行编码。
[0167]数据块不大于8KB编码规则:
[0168]先声明以下的符号+,不代表数学的求和运算,仅仅表示把+号前后的两个二进制数字或符号串连在一起。
[0169]a.若lenL〈3,则IenL可以用2位二进制数表示,再加一位前缀位,将其编码为OXX (此处和以下(标志位+XX)的格式均表示η位的二进制数字),并存放到c区。
[0170]b.若 18> = lenL> = 3,则 15> = (lenL-3) > = O,那么可以用 4 位二进制表示(lenL-3)的值,再加一位前缀位,为和a.条款区别,此处令前缀位为1,即这时可以将IenL分量编码为IXXXX (5位二进制数),并将其存放到c区。
[0171]c.若lenL>18,则可以用16位二进制数表示IenL的值,我们将16位二进制数的IenL的值存放到d区,并生成一个特殊标志011 (3位二进制数),存放到c区。
[0172]d.若T_lenC〈4且off〈512,则T_lenC可用2位二进制数表示,off可用9位二进制数表示,再加上2位前缀位,于是我们将(off,T_lenC)编码为00+XX(2位二进制数的T_IenC的值)+ΧΧΧΧΧΧΧΧΧ (9位二进制数的off的值),并将其存放到c区。
[0173]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区。
[0174]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)的值)+ΧΧΧΧΧΧΧΧΧ (9位二进制数的off的值),并将其存放到c区。
[0175]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区。
[0176]h.gT_lenC>= 19 且 off〈512,则 T_lenC 可用 16 位二进制数表示,off 可用 9 位二进制数表示,再加上2位前缀位,此处令前缀=10 (2位二进制数)。于是我们将(off,T_IenC)编码为10+1111(4位二进制数)+ΧΧΧΧΧΧΧΧΧ (9位二进制数的off的值),并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区。
[0177]1.^ 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区。
[0178]数据块大于8KB编码规则:
[0179]以下编码规则适用于输入数据流长度大于8192的情况。
[0180]a.若lenL〈3,则IenL可以用2位二进制数表示,再加一位前缀位,将其编码为OXX (此处和以下(标志位+XX)的格式均表示η位的二进制数字),并存放到c区。
[0181]b.若 18> = lenL> = 3,则 15> = (lenL-3) > = O,那么可以用 4 位二进制表示(lenL-3)的值,再加一位前缀位,为和a.条款区别,此处令前缀位为1,即这时可以将IenL分量编码为IXXXX (5位二进制数),并将其存放到c区。
[0182]c.若lenL>18,则可以用16位二进制数表示IenL的值,我们将16位二进制数的IenL的值存放到d区,并生成一个特殊标志011 (3位二进制数),存放到c区。
[0183]d.若T_lenC〈4且off〈512,则T_lenC可用2位二进制数表示,off可用9位二进制数表示,再加上2位前缀位,于是我们将(off,T_lenC)编码为00+XX(2位二进制数的T_IenC的值)+ΧΧΧΧΧΧΧΧΧ (9位二进制数的off的值),并将其存放到c区。
[0184]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区。
[0185]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)的值)+ΧΧΧΧΧΧΧΧΧ (9位二进制数的off的值),并将其存放到c区。
[0186]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区。
[0187]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区。
[0188]1.gT_lenC>= 19 且 off〈512,则 T_lenC 可用 16 位二进制数表示,off 可用 9 位二进制数表示,再加上3位前缀位,此处令前缀=100 (3位二进制数)。于是我们将(off,T_IenC)编码为100+1111 (4位二进制数)+ΧΧΧΧΧΧΧΧΧ (9位二进制数的off的值),并将其存放到c区,同时,将16位二进制数表示的T_lenC的值存放到d区。
[0189]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区。
[0190]k.gT_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区。
[0191]对所有的三元组(off,T_lenC, IenL)完成编码以后,形成了 c区数据序列和d区数据序列,c区和d区共同构成a区。
[0192]需要注意的是,具体的计算机存储方式有大端模式和小端模式之分,因而在压缩数据处理完毕后,会生成一个标志来表示是大端模式还是小端模式,本方法此前的描述都是基于大端模式的。本方法也可以适用于小端模式,对于小端模式计算机,可以把编码后的数据序列从尾部往前面倒序存放,处理顺序也前后颠倒,即从分区末尾往前处理即可。
[0193]经过以上的二次压缩编码,分区a被分割成了 c区和d区两个子分区,c区和d区的数据可以组合起来解析出完整的a区数据。
[0194]在二次压缩完成以后,生成分区c和分区d,并且一定要在a区头部生成若干个标志字节,记录分区c和分区d的长度、起始位置、8K标志、大端模式、小端模式和其他属性。
[0195]三元组(off,T_lenC, IenL)序列经过以上编码规则进行编码以后,生成了 a区数据。然后,我们将a区和b区组合在一起,并且在头部生成若干的标志字节,记录分区a和分区b的长度、起始位置、压缩模式和其他一些属性。这样就完成了对输
当前第4页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1