专利名称:数据压缩方法和设备的制作方法
技术领域:
本发明涉及信息通信和存储领域。更具体地说,本发明涉及压缩数字化信息以减小存储信息所需的存储器大小。
数据压缩被用来减小表示给定的一段信息(诸如数据流)所需的字符的数目。通过减少所用的字符的数目,数据流可被存储在较小的存储器中,或得到更为有效的传送,诸如在较短的时间中或使用较小的带宽。可以采用几种不同的方法中的一或多种来压缩数据。
在选择数据压缩方法时的两个重要的考虑,是数据压缩度和压缩发生的速度。压缩度指的是用来表示数据的字符数目的减小量。如果字符数目只是有略微的减小,则数据压缩的好处就不如字符数目大大减小时大。类似地,需要较多时间来压缩数据的压缩方法不如需要较短时间的方法好。因此,非常希望的是大大地减小表示数据所需的字符数目和运行时间短的数据压缩方法。
因而需要一种进行数据压缩的方法和设备—它们具有高压缩度并缩短了数据压缩所需的时间。
以上和其他的需要通过一种数据流压缩方法而得到了满足。该数据流的第一部分被读入一个窗口中,而该窗口具有一个历史缓存器和先行(look-ahead)缓存器。从先行缓存器中的数据流的第四部分取出的一个指标(index)得到了选择,且根据该指标,指针阵列中的一个登记项(entry)得到选择。根据该指针阵列登记项,一个记录阵列中的一个初始登记项得到选择。该记录阵列初始登记项具有一个历史缓存器地址和记录阵列地址。数据流的一个第三部分得到选择,该部分从初始登记项的历史缓存器地址所引用的历史缓存器中的一个地址开始。把数据流的该第三部分与在先行缓存器中的数据流的第二部分相比较。如果数据流的第三部分不与数据流的第二部分相匹配,则根据初始登记项的记录阵列地址,记录阵列中随后的登记项得到选择,且随后的登记项随后被指定为初始登记项。
从选择第三部分经过选择随后的登记项的步骤得到重复,直到数据流的第三部分与数据流的第二部分相匹配,或者在记录阵列中没有了剩下的登记项。在记录阵列不再有剩余的登记项的情况下,数据流的第二部分被写入到输出文件中,且读入窗口的数据流的第一部分被增加一个预定的量。在数据流的第三部分与数据流的第二部分相匹配的情况下,数据流的第三部分的历史缓存器地址和一个长度值—它表示了数据流的第三部分与数据流的第二部分有多少字节是匹配的—被输出到输出文件,且读入窗口的数据流的第一部分被增加了匹配的字节数。该方法从选择指标的步骤起的步骤得到重复,直到所有的数据流都被读入窗口。
通过以下结合附图—这些附图为了进行更好的显示而没有按照比例且其中相同的部件用相同的标号表示—所进行的详细描述,本发明的进一步的优点将变得显而易见。在附图中
图1是压缩设备的一个实施例的功能框图;图2显示了形成记录阵列登记项的一种级联方法。
图3是更新指针阵列和记录阵列的方法的一个实施例的流程图;图4是采用该指针阵列和记录阵列来选择数据流的第三部分的一个实施例的流程图。
在其基本形式下,数字数据通常用一串0和1来表示。每一个0和每一个1被称为一位。成组的0和1(称为字节)能够表示不同的字符,诸如字母和数字。一个字节可由不同数目的位组成,具体根据实施该方法的硬件而确定。图1中给出了较好的压缩设备的功能框图。
较好地,压缩以用位形式的运行段长度编码对开始的数据流进行转换作为开始。这是通过计数流中的一个运行段中的相继的0或1的数目,并将这些运行段长度数目写入到一个输出文件中,而实现的。例如,表1显示了一个32位的输入数据流。
00001100111110000011101010000111表1. 输入数据流在最佳实施例中,写入输出文件的第一运行段长度数始终是起始的0的数目。在表1所示的例子中,起始的0的数目为4。因此,数目4首先被写入输出文件中。应该理解的是,输出文件较好地也是一个数字文件,因而表示数4的一个0和1的位模式将被写入输出文件。对于在此讨论的所有被写入的数目,最好都是这种情况。如果输入数据流的第一个字符是1而不是0,则一个值0将被写入输出文件,表明在输入数据流的开始处没有0。
在起始的0的数目被写入输出文件之后,在起始的0运行段之后的1的数目被写入输出文件。在表1显示的例子中,起始的0运行段之后的1的数目为2。因此,2被写入输出文件。按照以上的方式,0和1的运行段长度数目以交替的方式被写入输出文件。如果0或1的运行段长度超过了254,则一个值255被写入输出文件,该运行段的剩余部分得到计数,且该剩余的值随后也被写入输出文件。对于非常长的运行段,在剩余的值被写入之前会有若干个255值被写入输出文件。因此,当解压缩输出文件时,解压缩程序较好地是认为值255表示下一个值应该被加到值255上以实现实际的运行段长度值。
应该理解的是,这种方法对于大于或小于32位的长度的输入数据流也同样是可以采用的,而选择32位的长度是为了描述该方法的方便。当表1所描述的输入数据流中的所有0和1都借助位运行段长度编码而得到处理时,产生出如表2描述的输出文件。
4,2,2,5,5,3,1,1,1,1,4,3表2.输出文件运行段长度编码通常在一定程度上减小了输入数据流的长度,但不是压缩所有类型的数据流的一种有效方法。例如,如果输入数据流没有几个运行段超过一个相继的0或1,则输出文件就不会比输入数据流小很多,且处理输入数据流所需的时间可能不值得进行所获得的程度的压缩。因此,在最佳实施例中,运行段长度编码是数据压缩方法和设备中的可选择的可选的第一步骤。对于其中采用了运行段长度编码的那些情况,来自运行段长度编码的输出文件将被认为是以下所描述的其他压缩操作的输入数据流。
输入数据流随后借助一种修正的滑动窗口法而得到压缩。在本质上,这种方法通过寻找数据流中重复的相同字符运行段来压缩输入数据流。在位运行段长度编码的例子中,该例子将被描绘成由1和0表示的一个输入数据流。虽然数据压缩的滑动窗口级的输入数据流最好也是1和0,这些1和0可用其他的字符表示,这使得该方法更容易得到理解。
较好地,输入数据流被读入具有两个部分即一个历史缓存器和一个先行缓存器的一个滑动窗口中。在最佳实施例中,历史缓存器的大小为512字节和先行缓存器的大小为277字节。然而,在替换实施例中,也可选择其他大小的历史缓存器和先行缓存器。
该窗口被指定为滑动窗口,因为输入数据流将经常包含比该窗口一次所能够容纳的字符多的字符。因此,只有输入数据流的第一部分可一次得到处理,且当前面的第一部分被处理并被写入输出文件时,输入数据流的随后的一部分被读入窗口。输入数据流的该随后的部分随后被指定为数据流的第一部分,且处理以此方式连续进行,直到最好所有输入数据流都得到了这样的处理。虽然在此采用的术语把输入数据流描述为被读入窗口的,应该理解的是这只是描述性的语言,且该方法的实际实施可以以若干种方式中的一或多种进行。例如,在最佳实施例中,输入数据流被全部或部分地保持在一个存储器中,且指针被用来定义当前处于历史缓存器或先行缓存器中的数据流部分。
为了处理数据流的第一部分,把当前驻留在先行缓存器中的数据流部分与当前驻留在历史缓存器中的数据流部分进行比较。来自先行缓存器的被比较的数据流部分将被指定为第二部分,且来自历史缓存器的被比较的数据流部分将被指定为第三部分。如果第二部分与第三部分之间存在着匹配,则两个值作为一对而被写入输出数据文件。第一个值表示了历史缓存器中的数据流的第三部分的开始地址,且第二个值表示了与第三部分匹配的第二部分的长度。输入数据流随后通过滑动窗口第二值的字符数—它是被发现匹配的字符的数目。例如,考虑表3中给出的数据流,它表示了滑动窗口中的数据流的第一部分。为了举例的目的,将采用20个字符的窗口大小。
0000000001111111111212345678901234567890ABCDEFGHIJKLMNOFGHOL历史缓存器 ^ 先行缓存器表3.在20字符滑动窗口中的输入数据流在数据流的断开处之下的“^”符号表示了历史缓存器与先行缓存器之间的分割。应该理解的是,输入数据流不一定是在历史缓存器与先行缓存器之间物理分割的,而是可以采用指针或其他类似的装置来跟踪哪一个数据流部分处于历史缓存器中且哪一个数据流部分处于先行缓存器中。在数据流的字母数据之上列出的值表示了地址,如将在下面讨论的。较好地,窗口在数据流得到处理的同时沿着该数据流滑动,从而使还没有得到处理的新的数据流部分首先进入先行缓存器,且随后以增量的方式通过历史缓存器,直到它们在窗口的历史缓存器端退出滑动窗口。
考虑到在先行缓存器中的数据流的第二部分是以字符F开始的。所希望的是找到历史缓存器中与先行缓存器中的第二部分相匹配的第三部分。在找到匹配之前,历史缓存器中的数据流的几个不同部分可以与第二部分相比较。例如,第二部分的开始即字符F可以与历史缓存器的第一个字符A—它将被指定为第三部分—相比较。当然,这些字符不匹配,因而历史缓存器中的数据流的随后部分将被选为数据流的第三部分,以与第二部分进行比较。例如,下一个第三部分可以从历史缓存器中的下一个字符即字符B开始。这不与数据流的第二部分匹配,因而一个随后的第三部分将得到选择。
历史缓存器中数据流的起始和随后的第三部分得到选择的方法,能够大大地减小找到匹配所需的时间。例如,起始的第三部分可以总是通过以历史缓存器的第一字符开始而得到选择,且随后的第三部分,可通过每次使一个字符串行通过历史缓存器行进直到找到匹配或到达了历史缓存器的结束,而得到选择。然而,可通过产生某些类型的指标来更有效地选择起始和随后的第三部分。这个话题将在随后的讨论中得到更详细的考虑。
不论找到起始和随后的第三部分的方法如何,当在第三部分与第二部分之间找到了匹配时,匹配的第三部分的开始地址得到记录。这种地址较好地是从历史缓存器的开始处的偏移值的形式的。在表3的例子中,历史缓存器中的匹配F的地址是6。该地址6成为写入输出文件的输出对的第一个值。将要写入的下一个值是与第二部分匹配的第三部分的长度。在所述的例子中,FGH的第二部分与FGH的第三部分匹配,因而表示第三和第二部分中的三个匹配字符的值3作为输出对的第二值而被写入输出文件。
应该理解的是,在历史缓存器中可能有一个以上的第三部分与先行缓存器中的第二部分相匹配。在这种情况下,必须采用一种方法来决定匹配的第三部分中哪一个是最好的匹配。较好地,与第二部分的最大数目的字符相匹配的第三部分将被认为是最好的匹配,因为较大部分的输入数据流在此步骤中通过这种判定而得到处理。如果两个或多个第三部分与第二部分匹配的字符数目相同,则在最佳实施例中,最好的匹配是这样的一个第三部分—即它在表示地址的字符方面有最小的地址。以此方式,输出文件能够被保持在尽可能地小。在这些表所示的例子中,第三部分的地址是以从历史缓存器的开始处的偏移来计算的。然而,应该理解的是,在替换实施例中可以采用其他的寻址方案,诸如从历史缓存器最接近先行缓存器的另一端来计算偏移。
当以此方式找到了匹配时,输入数据流以与写入输出文件的第二值相同的字符数目的增量—即第三和第二部分的匹配的长度—的方式通过滑动窗口。因此,相同字符数目的输入数据流将在滑动窗口的一端以增量的方式移出历史缓存器,且相同字符数目的输入数据流将在滑动窗口的另一端以增量的形式进入先行缓存器。对于上面给出的例子,第二值是3,因而在使数据流增量通过窗口之后,窗口将随后保持如表4所示的数据流。
0000000001111111111212345678901234567890DEFGHIJKLMNOFGHOLABD历史缓存器 ^ 先行缓存器表4.在20字符滑动窗口中的输入数据流驻留在窗口中的输入数据流的这种增量部分,变成了正在处理的数据流的新的第一部分。先行缓存器中的数据流的新的第二部分从字母O开始。偏移地址数保持了它们的位置,且在第二部分与起始或随后的第三部分之间找到匹配的处理被重新开始。在此例中,第二部分与历史缓存器中从地址12开始的第三部分相匹配,且持续了1字符的长度。因此,为在表3和4中显示的所找到的匹配而写入输出文件的头两对如表5中所示。
6,3,12,1表5.输出文件应该理解的是,值写入输出文件的顺序可以是相反的,从而使该长度可以是写入的第一个值且地址可以是写入的第二个值。写入输出文件的值,诸如地址和长度值,可以如表5所示地被写入输出文件,但较好地是利用不同的方案写入,这些方案被用来减小输出文件的大小。例如,可以使地址或长度值记号化,而不是以实际值的形式写入。较好地,用户可选择一或两种不同的输出文件编码方法,或者是静态编码法或者是动态编码法。
在静态编码法中,长度和地址值之一或两者可被映象到具体的固定位序列上。在该方法的最佳实施例中,只有长度被如此记号化,且地址被写入一个固定长度9位域。长度值通过查询一个预定表—它把长度值与一个记号字符联系起来—中的长度值,而得到编码。该记号字符的长度最好比长度值短,且较好地,最频繁地出现的那些长度值被分配了最短的记号,从而使输出文件能够尽可能地小。如果没有找到匹配,或者匹配长度为一,则编码给出一个二进制0,随后是非匹配的字节。对于8位字节,这将是总共9个位。当输出文件被解码时,解码器再次在整个预定表上运行长度记号,并得到长度值。
如果找到了大于1的匹配长度,则在最佳实施例中采用了表6给出的记号表匹配长度 长度码 位移码2-3 10x 9位码4-7 1110xx 9位码8-15 1110xxx 9位码16-31 11110xxxx9位码32-27711111xxxxxxxx9位码表6.静态记号表该9位位移码的计算最好如下temp=(先行缓存器中的第一个字节的地址)-(匹配-位置-地址)-1如果(temp<0)则(位移码)=temp+796否则(位移码)=temp其中地址是历史缓存器的地址。
长度编码的X是用编码范围中的给定长度的偏移来编码的。例如,对于8-15的范围,12的串长度将被编码为1110100,在该范围中有偏移4。最后的记号是后面跟有该位移码的长度码。当压缩器完成了压缩循环时,一个专用的文件结束记号,较好地是11111111111,被写入输出文件。这标志了输出文件的结束。
动态编码法的基本工作原理与静态编码法的相同,只是长度值编码所借助的表不是一个不随着数据流的处理而改变的静态预定表,而是一个动态表—它根据正在处理的数据流的具体字符而改变。在此方法中,不同长度值的出现频率得到了监测,且当给定的长度值的频率增大时,它在表中被给予比出现频率较小的长度值的记号短的记号。较好地,一组预定的规则被用来进行这些表分配判定,且规则组被提供给压缩器和解压缩设备,从而使解压缩器可在压缩器对输出文件进行写入的同时在输出文件处理的同一点处进行表的改变,且输出文件将被解压缩器完全重组成起始的数据流。通过采用动态表,出现最频繁的长度值被给予了最短的记号值,即使在数据流压缩过程中出现频率发生改变的情况下也是如此。
例如,在最佳实施例中,第二种编码方法在开始时采用了上述的编码方法来产生输出记号。当记号被产生时,逻辑电路对产生了多少各个类型的记号进行跟踪。如果一种给定记号类型的频率超过了以较少的长度码位编码的记号类型,则这种频率较高的记号类型将取采较少长度码位类型的长度码。请考虑表7中给出的记号化表。
类型匹配长度长度码 位移码A 2 100 9位码B 3 101 9位码C 4-7 1110xx 9位码D 8-151110xxx 9位码E 16-31 11110xxxx9位码F 32-277 11111xxxxxxxx9位码表7.起始配置中的动态编码表例如,如果在压缩任务期间类型E记号的数目超过了类型D记号的数目,则将来的类型E和D记号将如表8所示地得到编码类型 匹配长度 长度码 位移码D8-15 11110xxx9位码E16-31 1110xxxx9位码表8.重新配置之后的动态编码表以上已经给出了可用的记号的具体实施例。然而,应该理解的是这些记号只是最佳实施例中所可以采用的记号的例子。当然,可以在采用的记号的更广泛的概念内采用其他的记号,以对长度数据和位移进行编码,以及一种动态方案—其中编码可在有利时得到改变。
在最佳实施例中,压缩方法是以同时发生的方式运行的,从而在同时进行该方法的几个不同步骤。例如,通过提供一个以上的比较器以比较第三和第二部分,可以一次比较一个以上的第三部分,且可以更迅速地发现匹配。在最佳实施例中,采用了四个比较器。
如果在先行缓存器中没有与第二部分匹配的第三部分,则数据流以增量的形式通过窗口一定数目的字符。这些以增量的形式从先行缓存器进入历史缓存器的字符被写入输出文件,且重复试图把新的第二部分与起始或随后的第三部分进行匹配的处理。在最佳实施例中,数据流是以单个字符的方式增量的,因而单个的字符被如上所述地写入输出文件,并以增量的形式从先行缓存器进入历史缓存器。
如上所述,该压缩设备可通过采用与串行步进通过历史缓存器不同的方法而迅速地在数据流上进行操作,从而找到数据流的候选第三部分。较好地,具有两个阵列的一种设备被用来更迅速地识别历史缓存器中可能是与先行缓存器中的第二部分匹配的候选者的第三部分。这两个阵列被指定为指针阵列和记录阵列。
作为概述,当把数据流的第一部分读入窗口时,数据流的第四部分被用来产生一个指标,该指标被用来选择指针阵列中的一个登记项。指针阵列中的该登记项随后被用来选择记录阵列中的一个初始登记项。记录阵列中的该初始登记项包含历史缓存器中可能与数据流的第二部分匹配的数据流起始第三部分的地址。记录阵列中的初始登记项还具有记录阵列地址—它指向记录阵列中的随后的登记项,该随后的登记项也包含可能是与数据流的第二部分匹配的候选者的数据流的随后第三部分的历史缓存器地址。如果初始登记项引用的第三部分没有提供与第二部分的适当匹配,或者如果希望比较更多的第三部分,则随后的登记项将得到采用。以此方式,提供了更为有效和明确的可能匹配定位方法。
访问的随后记录阵列登记项的数目取决于几种标准的平衡。例如,如果到达了记录阵列的结束,则选择随后的记录阵列登记项的处理可能停止。另外,如果记录阵列登记项中的历史缓存器地址指向与第二部分匹配的第三部分,且匹配的长度等于或大于一个预定值,则随后的记录阵列登记项可以不被调查。进一步地,只需要调查预定数目的记录阵列登记项,且在此点被发现匹配并具有最大匹配长度的任何一个第三部分都被用作匹配的第三部分。以此方式,较好的设备保证了不把太多的时间用在寻找匹配的第三部分上。
为了使指针阵列和记录阵列有用,它们必须被装载上数据并随后在压缩设备的操作期间得到保持。在图3中给出了这种处理的一个概述。为了装载阵列,数据流以增量的方式一次一个字节地被读入窗口,直到第一填充的先行缓存器满了,且在历史缓存器中有该数据流的一个字节。在此,数据流的第五部分—它在最佳实施例中是刚移入历史缓存器中的字节的低4位和先行缓存器的第一字节(它是将要以增量的方式进入历史缓存器的下一个字节)的低4位被连接起来。新形成的8位字节是用来查询指针阵列中的一个登记项的指针。因此,指针阵列的大小与用来形成指针的位的数目之间有一种关系。数字信息的八位有256个唯一的值,这是指针阵列的大小。因此,在替换实施例中,可选择其他的指针阵列大小,而适当的不同数目的位被用于产生指针。
在最佳实施例中,记录阵列有512个登记项的长度。因此,需要9位来指向记录阵列中的登记项。如上所述,历史缓存器较好地也具有512字节的大小,因而寻址历史缓存器中的所有字节也需要9位。也可以选择其他值的记录阵列和历史缓存器的大小,它们需要相应的不同数目的地址位来完成对它们的寻址。
指针所引用的指针阵列的登记项被读出和暂时保存,且其在指针阵列中的位置借助记录阵列中的下一个可用登记项的地址而得到复写。对于第一个循环,它是记录阵列的第一登记项,对于第二个循环它是第二登记项,等等。下一个可用的记录地址最好是以9位计数器来实施,并在压缩设备启动时被初始化至零。记录阵列中的缺省启动值表明了无效的记录登记项,因为在起始启动或复置之后所有的登记项都是无效的。从暂时保存的指针阵列来的登记项与历史缓存器中的第一个字节以及包含在历史缓存器的第一个地址中的字节的当前地址连接起来,并被写入被写入上述指针阵列的记录阵列中的下一个可用的登记项的地址所引用。对连接的记录阵列登记项的最佳实施例的描述在图2中给出。
在此,记录阵列的下一个可用的登记项的值被加1,且数据流的下一个字节从先行缓存器以增量的形式进入历史缓存器,且把8位指标形成指针阵列并装载该指针阵列和记录阵列的处理得到循环重复。这种处理较好地是被用来在数据流以增量的方式通过窗口时对指针阵列和记录阵列进行更新,并在每一个字节的数据流以增量的方式从先行缓存器进入历史缓存器时得到执行。
在最佳实施例中,以此装载和更新指针阵列和记录阵列的目的是使它们能够被用来为先行缓存器中的数据流的第二部分与历史缓存器中的数据流的第三部分之间的匹配提供可能的候选者。因此,每当数据流以增量—在未发现匹配的情况下该增量是一个字节或者该增量是前面的匹配长度的字节数目—的方式通过窗口时,较好地是采用找到可能的第三部分候选者的方法。在图4中给出了使用该指针阵列和记录阵列的较好方法的流程图。
首先,来自数据流的第四部分—较好地是先行缓存器中的头两个字节(它们是将要以增量的方式进入历史缓存器的下两个字节)的各个字节的低4位被连接成一个8位指标,且该指标被用来引用指针阵列中的一个登记项。虽然可以采用来自这两个字节的每一个的不同数目的位数,且可以采用不同数目的字节,但采用最佳实施例中的这种方法是有利的。当借助运行段长度编码进行处理时,很多数据流将产生不超过16的值。这意味着通常一个数据流没有长度超过16个字符的0或1的运行段。因此,来自运行段长度编码器的多数的区分信息将被包含在字节的低4位中。因此,这些是被用来装载指针阵列的位,并产生了用于读取指针阵列的指标。在一个替换实施例中,可采用来自各个字节的五个位。在此实施例中,指针阵列的大小较好地是1024个登记项,这是10个位所能够存取的登记项的数目。
指针阵列中被该指标所引用的登记项被读出并受到有效性检查。无效的指针阵列登记项是包含当压缩方法被启动或复置时被写入指针阵列的缺省值的登记项。如果该指针阵列登记项包含一个无效值,则不存在第三部分匹配候选者,且压缩程序把先行缓存器中的第一字节写入输出文件,使数据流以一个字节的增量通过窗口,并产生一个新的指标。
如果被指标引用的指针阵列中的登记项是有效的,则它是记录阵列中的一个地址,且它是根据指针阵列中的登记项而选择的。这是起始记录阵列登记项。记录阵列中选定的登记项包含一个历史缓存器地址、另一记录阵列地址、以及前面从历史缓存器读出的一个字节的连合,如上所述。来自历史缓存器的字节起着有效检查的作用。如果该字节不与先行缓存器的第一个字节匹配,则记录阵列登记项是无效的,这表明没有更多的第三部分候选者需要进行匹配检查。
如果起始记录阵列登记项是有效的,则在此登记项中的历史缓存器地址引用历史缓存器中的一个候选者第三部分。该地址被传送到一个比较器单元,该单元查询历史缓存器中的第三部分,并将其与先行缓存器中的第二部分进行匹配比较。如果发现了匹配,则该匹配的长度也由该比较器单元确定。
该起始记录阵列登记项还包含至记录阵列中的随后的登记项的地址。该随后的登记项也受到有效性检查,且如果有效,该历史缓存器中由该随后的登记项的历史缓存器地址所引用的历史缓存器中的随后的第三部分,也由比较器进行与第二部分的匹配的检查。这种随后的登记项可随后被指定为初始登记项,且在记录阵列中发现更多随后的登记项的处理继续进行。这种发现额外的登记项并把历史缓存器中的额外第三部分与先行缓存器中的第二部分相比较的处理被继续进行,直到几个较好的标准中的至少一个得到满足。这些标准较好地是如上所述记录阵列中没有更多的有效登记项,已经发现了适当的匹配,或者已经识别了记录阵列中的预定数目的登记项且它们的相关历史缓存器地址已经被传送到了比较器单元。在此,或者没有发现匹配,或者采用在此点所发现的最好的匹配,且压缩方法如上所述地继续进行。
当所有输入的数据流都以增量的方式通过了窗口时,数据流的压缩结束。应该理解的是,先行缓存器或历史缓存器的充满并不是设备运行所必需的,而设备将识别缓存器包含有效信息的那些部分。这在例如文件的大小被压缩成了小于先行缓存器或历史缓存器的大小时是重要的。输出文件—它可如上所述地被记号化—可被一个解压缩器所解压缩,而该解压缩器采用与上述选定压缩程序相反的顺序对输出文件进行操作。
虽然已经对本发明的具体实施例进行了以上的具体描述,应该理解的是本发明也同样可应用于本领域的技术人员众所周知的不同的应用。
权利要求
1.一种用于压缩数据流的方法,包括a.把数据流的一个第一部分读入一个窗口,该窗口具有一个历史缓存器和一个先行缓存器,b.选择一个从先行缓存器中的数据流的一个第四部分取得的指标,c.根据该指标选择一个指针阵列中的一个登记项,d.根据该指针阵列登记项选择一个记录阵列中的一个初始登记项,该记录阵列初始登记项具有一个历史缓存器地址和一个记录阵列地址,e.选择从被初始登记项的历史缓存器地址所引用的历史缓存器中的一个地址开始的数据流的一个第三部分,f.把数据流的该第三部分与先行缓存器中的数据流的一个第二部分进行比较,g.如果数据流的该第三部分不与数据流的第二部分相匹配,则根据初始登记项的记录阵列地址选择记录阵列中的一个随后的登记项,该随后的登记项随后被指定为初始登记项,h.重复步骤e.至g.,直到数据流的第三部分与数据流的第二部分相匹配或者在记录阵列中不再有登记项,i.如果记录阵列中不再有剩下的登记项,则把数据流的该第二部分写入输出文件,并使读入到窗口的数据流的第一部分有一个预定量的增量,且ii.如果数据流的该第三部分与数据流的该第二部分匹配,则把数据流的该第三部分的历史缓存器地址以及表示数据流的该第三部分和数据流的该第二部分有多少字节匹配的一个长度值输出到输出文件,并使读入到窗口的数据流的第一部分增加匹配的字节数,以及i.重复从步骤b.开始的方法,直到所有数据流都已经被读入窗口中。
2.用于压缩一种初始数据流的设备,包括a.一个位运行段长度预处理器,用于借助运行段长度编码来有选择地压缩初始数据流中相继运行的0和1并产生一个预处理过的数据流,b.一种滑动窗口压缩器,用于有选择地读取初始和预处理数据流之一的一个第一部分,该滑动窗口压缩器包括一个具有地址和512字节大小的历史缓存器以及一个具有地址和277字节大小的先行缓存器,c.具有带有地址的登记项和先行缓存器中的数据流的第一个字节的一个记录阵列,至少一部分登记项包含其他记录阵列登记项的地址以及一个历史缓存器地址中,d.一个指针阵列,它具有带有地址的登记项,至少一部分登记项包含记录阵列中的登记项之一的地址,e.用于从先行缓存器中的数据流的第一字节的一部分和一个第二字节的一部分产生一个指标的装置,f.用于选择并读取具有与指标相应的地址的指针阵列中的登记项的装置,g.用于确认选定的指针阵列登记项的装置,一个无效的指针阵列登记项是不包含记录阵列中的一个登记项的地址的指针阵列登记项,h.用于选择和读取具有与从指针阵列的有效登记项读取的地址相应的地址的记录阵列中的一个初始登记项的装置,i.用于确认选定的记录阵列初始登记项的装置,一个无效的记录阵列初始登记项是不包含先行缓存器中的数据流的第一个字节的记录阵列初始登记项,j.用于选择从包含在确认的记录阵列初始登记项中的历史缓存器的地址开始的数据流的一个第三部分的装置,k.比较器单元,用于把数据流的该第三部分与数据流从先行缓存器中的第一个字节开始的一个第二部分相比较,并判定该第三部分是否与该第二部分相匹配,并用于进一步确定第三部分与第二部分的匹配长度—该匹配长度是用字节数表示的,l.用于根据包含在初始登记项中的记录阵列地址选择记录阵列中的一个随后的登记项的装置,该随后的登记项随后被指定为初始登记项,m.用于重复操作部件j至l直到包括第三部分与第二部分相匹配的字节数至少等于一个预定值、在记录阵列中不再有登记项、以及已经调查了至少预定数目的记录阵列登记项的至少一个条件得到满足的装置,n.用于选择根据包括第三部分的长度和地址的标准确定的与第二部分匹配得最好的第三部分的装置,o.用于把选定的第三部分的长度和历史缓存器地址输出到一个输出文件的装置,p.用于有选择地利用一个静态表和一个动态表中的一个来使至输出文件的长度输出记号化的装置,q.用于根据不随着数据流中的不同而改变的该静态表的预定顺序来使该长度记号化的静态表,r.用于按照根据数据流中的不同而改变动态表的预定顺序的规则来使该长度记号化的动态表,s.用于把读入窗口的数据流的第一部分增加一定字节数目直到所有数据流都得到压缩的装置,该字节数目在发现了匹配的情况下是由长度确定的,且该字节数目在没有发现匹配的情况下是1,以及t.用于把一个值1111111111111写入输出文件的装置。
全文摘要
用于压缩数据流的方法,其中数据流的一个第一部分被读入一个窗口,该窗口有一个历史缓存器和先行缓存器。从先行缓存器中的数据流的一个第四部分选择一个指标,且根据该指标,选择一个指针阵列中的一个登记项。根据该指针阵列登记项选出一个记录阵列中的一个初始登记项。该记录阵列初始登记项具有一个历史缓存器地址和记录阵列地址。数据流的一个第三部分得到选择,它从初始登记项的历史缓存器地址所引用的历史缓存器中的一个地址开始。
文档编号H03M7/40GK1200604SQ9810831
公开日1998年12月2日 申请日期1998年5月12日 优先权日1997年5月12日
发明者克莱格·埃里克·哈达迪 申请人:莱克斯马克国际公司