基于Deflate的压缩数据块输出方法及装置与流程

文档序号:13475873阅读:170来源:国知局
基于Deflate的压缩数据块输出方法及装置与流程

本发明涉及数据处理技术领域,尤其涉及一种基于deflate的压缩数据块输出方法及装置。



背景技术:

无损压缩算法是利用数据的统计冗余进行压缩,原始数据可完全恢复而不引起任何失真。由于不同数据的冗余程度不一,压缩后的数据长度是不一样的。目前,很多存储设备一般使用固定长度的存储空间来存储数据。我们统一把固定长度的存储空间称作容器。容器的长度在不同的存储设备中可以是不同,比如有的存储设备选择4k字节,有的选择1m字节。当原始数据压缩后比允许的容器长度更大的时候,能够在当前容器边界上截断输出,把后半部分原始数据存到下一个容器中去。

deflate压缩算法广泛应用于gzip,zlib文件格式中,是目前应用最广泛的无损压缩算法之一,经其压缩后的文件大小可以变长,如此造成压缩数据块的输出长度与容器的大小和边界不一致,容器的最后一部分可能是空白的,导致容器的空间利用率较低的问题。

有鉴于此,有必要提出对目前的基于deflate的固定长度压缩数据块输出方法进行进一步的改进。



技术实现要素:

为解决上述至少一技术问题,本发明的主要目的是提供一种基于deflate的压缩数据块输出方法。

为实现上述目的,本发明采用的一个技术方案为:提供一种基于deflate的压缩数据块输出方法,包括:

在容器的剩余空间小于设定阈值时,确定当前压缩数据块的上限为剩余空间大小;

继续向容器的剩余空间中添加符号数据,在原文缓冲计数器和静态huffman缓冲计数器都发生溢出的时刻或根据两者中后一个发生溢出的时刻,确定产生新的压缩数据块的时间节点;以及

在保证压缩数据块不溢出容器的前提下,选择压缩比最大的编码输出新的压缩数据块,所述编码为静态huffman编码、动态huffman编码以及原文件编码中任意一种。

在一具体的实施例中,所述确定当前压缩数据块的上限为剩余空间大小的步骤之前还包括:

预先分配一统计容器中符号数据个数的原文缓冲计数器及静态huffman缓冲计数器,其中,所述原文缓冲计数器及静态huffman缓冲计数器的上限可调整。

在一具体的实施例中,所述选择压缩比最大的编码输出新的压缩数据块的步骤具体包括:

选择静态huffman编码与原文件编码中压缩比较大的编码输出新的压缩数据块。

在一具体的实施例中,所述选择压缩比最大的编码输出新的压缩数据块的步骤为:

选择动态huffman编码作为压缩比最大的编码输出新的压缩数据块,具体包括:

如果动态huffman编码小于容器的剩余空间,则得到一可继续添加符号数据的填充空间;

如果动态huffman编码等于容器的剩余空间,则以新的压缩数据块作为输出块;

如果动态huffman编码大于容器的剩余空间,则选取原文缓冲计数器和静态huffman缓冲计数器中后溢出的那个所对应的编码作为输出块。

在一具体的实施例中,在所述容器得到一可继续添加符号数据的填充空间的步骤后,还包括:

继续向容器的填充空间中添加符号数据,以最大压缩比编码输出填充块,其中,所述填充块为静态huffman编码、动态huffman编码以及原文件编码中任意一种。

为实现上述目的,本发明采用的另一个技术方案为:提供一种基于deflate的压缩数据块输出装置,包括:

第一确定模块,在容器的剩余空间小于设定阈值时,确定当前压缩数据块的上限为剩余空间大小;

第二确定模块,继续向容器的剩余空间中添加符号数据,在原文缓冲计数器和静态huffman缓冲计数器都发生溢出的时刻或根据两者中后一个发生溢出的时刻,用于确定产生新的压缩数据块的时间节点;以及

选择输出模块,在保证压缩数据块不溢出容器的前提下,用以选择压缩比最大的编码输出新的压缩数据块,所述编码为静态huffman编码、动态huffman编码以及原文件编码中任意一种。

在一具体的实施例中,所述基于deflate的压缩数据块输出装置还包括:

预分配模块,用于预先分配一统计容器中符号数据个数的原文缓冲计数器及静态huffman缓冲计数器,其中,所述原文缓冲计数器及静态huffman缓冲计数器的上限可调整。

在一具体的实施例中,所述选择输出模块具体用于:

选择静态huffman编码与原文件编码中压缩比最大的编码输出新的压缩数据块。

在一具体的实施例中,所述选择输出模块具体用于:

选择动态huffman编码作为压缩比最大的编码输出新的压缩数据块,具体包括:

如果动态huffman编码小于容器的剩余空间,则得到一可继续添加符号数据的填充空间;

如果动态huffman编码等于容器的剩余空间,则以新的压缩数据块作为输出块;

如果动态huffman编码大于容器的剩余空间,则选取原文缓冲计数器和静态huffman缓冲计数器中后溢出的那个所对应的编码作为输出块。

在一具体的实施例中,所述选出输出模块,用于继续向容器的填充空间中添加符号数据,以最大压缩比编码输出填充块,其中,所述填充块为静态huffman编码、动态huffman编码以及原文件编码中任意一种。

本发明的技术方案主要采用在容器的剩余空间小于设定阈值时,确定当前压缩数据块的上限为剩余空间大小,然后继续向容器的剩余空间中添加符号数据,在原文缓冲计数器和静态huffman缓冲计数器都发生溢出的时刻或根据两者中后一个发生溢出的时刻,确定产生新的压缩数据块的时间节点;最后在保证压缩数据块不溢出容器的前提下,选择压缩比最大的编码输出新的压缩数据块,能够在容器边界上截断输出时,尽量把较多的内容存在当前的容器,从而可以提高当前容器空间的有效利用率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图示出的结构获得其他的附图。

图1为本发明一实施例基于deflate的压缩数据块输出方法的方法流程图;

图2为本发明另一实施例基于deflate的压缩数据块输出方法的方法流程图;

图3为本发明又一实施例基于deflate的压缩数据块输出方法的方法流程图;

图4为本发明一实施例基于deflate的压缩数据块输出装置的模块方框图;

图5为本发明另一实施例基于deflate的压缩数据块输出装置的模块方框图;

图6为本发明容器的存储数据的示例图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

需要说明,本发明中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。

为了更好地的理解本发明的技术方案,下面对deflate压缩算法进行详细描述。在使用deflate压缩时,先使用lz77算法的一个变种进行压缩,如果文件中有两块内容相同的话,那么只要知道前一块的位置和大小,从而可以确定后一块的内容,如此,可以用[距离,长度](两者之间的距离,相同内容的长度)这样一个符号,来替换后一块内容。由于(两者之间的距离,相同内容的长度)这一对信息的比特(bit)数,小于被替换内容的比特数,因此数据得到了压缩。经lz77算法压缩的结果被称为符号数据,符号数据被暂时存放在输出缓冲区l_buf[],d_buf[],flag_buf[]中。对于lz77算法的压缩结果,可能使用一块输出或者分成多块输出(lz77压缩一定的部分之后,就进行一次块输出,输出一块)。如此,deflate算法的输出文件里包含一个或者多个输出块,并且每个输出块的大小不固定。而当l_buf[]满时,或者d_buf[]满时,将对现有的lz77压缩的结果进行huffman编码并输出到一个压缩数据块中。对lz77算法压缩得到的结果可以使用huffman编码的方法(实际上deflate根据情况,选择使用静态huffman编码或者动态huffman编码)进行压缩。huffman编码利用统计学概率对结果进行编码,可以进一步压缩数据。

静态huffman编码使用deflate自己预先定义的一套编码进行压缩,解压缩的时候也使用这套编码,这样不需要传递用来生成树的信息。动态huffman编码使用统计好的各个符号的出现次数建立huffman树,产生各个符号的huffman编码,用这产生的huffman编码进行压缩,这样需要传递生成树的信息。deflate算法在为一块数据进行huffman编码之前,先比较使用静态huffman树编码和使用动态huffman树编码以及不压缩的原文本,所生成的块的大小。然后使用生成块较小的方法进行huffman编码。

由于动态huffman编码根据当前的数据的特征产生,大多数时候动态huffman编码的效率要高于静态huffman编码的效率。但是动态huffman编码需要传递动态树这个信息。而静态huffman编码不需要传递静态树的信息。当文件比较小的时候,传递动态树的信息得不偿失,反而会使压缩文件变大。也就是说对于文件比较小的时候,就可能会出现使用静态huffman编码比使用动态huffman编码,生成的块小。另外要注意的是lz77和huffman编码的过程不一定能保证结果小于原文件。使用静态或者动态huffman编码输出比原文件更大的时候,deflate选用原文件作为当前压缩数据块输出。deflate算法的输出块的大小是不固定的,首先在进行huffman编码之前,要输出的内容的大小就是不固定,要看情况,进行huffman编码之后,就更不固定了。为此,本发明提供了一种基于deflate的压缩数据块输出方法,具体方案请参照下述实施例。

请参照图1,在本发明实施例中,该基于deflate的压缩数据块输出方法,包括:

步骤s10、在容器的剩余空间小于设定阈值时,确定当前压缩数据块的上限为剩余空间大小;

步骤s20、继续向容器的剩余空间中添加符号数据,在原文缓冲计数器和静态huffman缓冲计数器都发生溢出的时刻或根据两者中后一个发生溢出的时刻,确定产生新的压缩数据块的时间节点;以及

步骤s30、在保证压缩数据块不溢出容器的前提下,选择压缩比最大的编码输出新的压缩数据块,所述编码为静态huffman编码、动态huffman编码以及原文件编码中任意一种。

本实施例中,容器中可以存储多个压缩数据块,在容器存储有多个压缩数据块而没有溢出时,可以通过确定容器剩余空间的大小来继续添加压缩数据块。当容器剩余空间的大小或等于大于设定阈值时,可以继续以deflate原有算法编码压缩数据块,当容器剩余空间的大小或等于小于设定阈值时,本方案通过引入中介原文缓冲计数器及静态huffman缓冲计算器,原文缓冲计数器可以按照推入原文输出缓冲区的比特数来累计;静态huffman缓冲计数器把推入输出缓冲区的符号,按照静态huffman编码产生的比特数来累计。根据两个缓冲区都溢出的时刻或根据两者中后一个发生溢出的时刻确定产生新的压缩数据块的时间节点,最后在满足压缩数据块不溢出容器的条件下,选择压缩比最大的编码输出新的压缩数据块,如此,可以提高当前容器空间的有效利用率。

本发明的技术方案主要采用在容器的剩余空间小于设定阈值时,确定当前压缩数据块的上限为剩余空间大小,然后继续向容器的剩余空间中添加符号数据,在原文缓冲计数器和静态huffman缓冲计数器都发生溢出的时刻或根据两者中后一个发生溢出的时刻,确定产生新的压缩数据块的时间节点;最后在保证压缩数据块不溢出容器的前提下,选择压缩比最大的编码输出新的压缩数据块,能够在容器边界上截断输出时,尽量把较多的内容存在当前的容器,从而可以提高当前容器空间的有效利用率。

请参照图2,在一具体的实施例中,所述确定当前压缩数据块的上限为剩余空间大小的步骤之前还包括:

步骤s01、预先分配一统计容器中符号数据个数的原文缓冲计数器及静态huffman缓冲计数器,其中,所述原文缓冲计数器及静态huffman缓冲计数器的上限可调整。

本实施例中,原文缓冲计数器及静态huffman缓冲计算器的上限可以根据剩余空间的大小进行适应性调整,以使原文缓冲计数器及静态huffman缓冲计算器与容器的剩余空间大小相等。

在一具体的实施例中,所述选择压缩比最大的编码输出新的压缩数据块的步骤具体包括:

选择静态huffman编码与原文件编码中压缩比最大的编码输出新的压缩数据块。

本实施例中,在容器的剩余空间小于阈值后,可以直接禁用动态huffman编码。把原文缓冲计数器和静态huffman缓冲计数器的上限设置成容器的剩余空间。对比原文缓冲计数器和静态huffman缓冲计数器中哪一个后溢出,后溢出的那个容纳的数据量一定越大,可以用后溢出的那个所对应的编码产生压缩数据块作为输出块。该方案相比于上述方案处理方式更简单。

在一具体的实施例中,所述选择压缩比最大的编码输出新的压缩数据块的步骤为:

选择动态huffman编码作为压缩比最大的编码输出新的压缩数据块,具体包括:

如果动态huffman编码小于容器的剩余空间,则得到一可继续添加符号数据的填充空间;

如果动态huffman编码等于容器的剩余空间,则以新的压缩数据块作为输出块;

如果动态huffman编码大于容器的剩余空间,则选取原文缓冲计数器和静态huffman缓冲计数器中后溢出的那个所对应的编码作为输出块。

结合上述的实施例,本方案能够两次向容器中添加符号数据,第一次向容器的剩余空间添加符号数据产生压缩输出块,是为了尽可能地利用动态huffman编码来压缩数据。第二次向容器的填充空间添加符号数据产生压缩输出块,是为了在第一次的压缩输出后还剩下的空间里,尽量多地塞进更多的压缩数据。

请参照图3,在继续上述实施例的基础上,在所述容器得到一可继续添加符号数据的填充空间的步骤后,还包括:

继续向容器的填充空间中添加符号数据,以最大压缩比编码输出填充块,其中,所述填充块为静态huffman编码、动态huffman编码以及原文件编码中任意一种。

本实施例中,容器的填充空间的数据填充,也可以采用上述实施例的方案,具体为:在填充容器的剩余空间小于设定阈值时,确定当前压缩数据块的上限为剩余空间大小;

继续向容器的填充空间中添加符号数据,在原文缓冲计数器和静态huffman缓冲计数器都发生溢出的时刻,确定产生填充块的时间节点;以及

在保证压缩数据块不溢出容器的前提下,选择压缩比最大的编码输出新的填充块,应该指出的是,最后一个符号对应的在输入数据的偏移量被记录下来,用作分隔输入数据在两个容器的分界线。作为本方案的一并列方案,当第一次选中动态huffman编码来输出压缩数据块后,如果还有填充空间,则该压缩数据块不结束,继续用当前压缩数据块的动态huffman树来编码后续的符号,直到容器的填充空间被全部填满。

请参照图4,本发明的实施例中,该基于deflate的压缩数据块输出装置,包括:

第一确定模块20,在容器的剩余空间小于设定阈值时,确定当前压缩数据块的上限为剩余空间大小;

第二确定模块30,继续向容器的剩余空间中添加符号数据,在原文缓冲计数器和静态huffman缓冲计数器都发生溢出的时刻或根据两者中后一个发生溢出的时刻,用于确定产生新的压缩数据块的时间节点;以及

选择输出模块40,在保证压缩数据块不溢出容器的前提下,用以选择压缩比最大的编码输出新的压缩数据块,所述编码为静态huffman编码、动态huffman编码以及原文件编码中任意一种。

本实施例中,本引入中介原文缓冲计数器及静态huffman缓冲计算器,原文缓冲计数器可以按照推入原文输出缓冲区的比特数来累计;静态huffman缓冲计数器把推入输出缓冲区的符号,按照静态huffman编码产生的比特数来累计,通过第一确定模块20可以确定原文缓冲计数器及静态huffman缓冲计算器的上限;然后根据第二确定模块30,在满足两个计数器都溢出时或根据两者中后一个发生溢出的时刻,确定产生新的压缩数据块的时间节点,最后,根据选择输出模块40,在满足压缩数据块不溢出容器的条件下,选择压缩比最大的编码输出新的压缩数据块,如此,可以提高当前容器空间的有效利用率。

请参照图5,在一具体的实施例中,所述基于deflate的压缩数据块输出装置还包括:

预分配模块10,用于预先分配一统计容器中符号数据个数的原文缓冲计数器及静态huffman缓冲计数器,其中,所述原文缓冲计数器及静态huffman缓冲计数器的上限可调整。

本实施例中,通过预分配模块10可以调整原文缓冲计数器及静态huffman缓冲计算器的上限,使其上限与剩余空间的大小相适应,即,原文缓冲计数器及静态huffman缓冲计算器的上限分别与容器的剩余空间大小相等。

在一具体的实施例中,所述选择输出模块40具体用于:

选择静态huffman编码与原文件编码中压缩比最大的编码输出新的压缩数据块。

本实施例中,在容器的剩余空间小于阈值后,可以直接禁用动态huffman编码。把原文缓冲计数器和静态huffman缓冲计数器的上限设置成容器的剩余空间。对比原文缓冲计数器和静态huffman缓冲计数器中哪一个后溢出,后溢出的那个容纳的数据量一定越大,可以用后溢出的那个所对应的编码产生压缩数据块作为输出块。该方案相比于上述方案处理方式更简单。

在一具体的实施例中,所述选择输出模块40具体用于:

选择动态huffman编码作为压缩比最大的编码输出新的压缩数据块,具体包括:

如果动态huffman编码小于容器的剩余空间,则得到一可继续添加符号数据的填充空间;

如果动态huffman编码等于容器的剩余空间,则以新的压缩数据块作为输出块;

如果动态huffman编码大于容器的剩余空间,则选取原文缓冲计数器和静态huffman缓冲计数器中后溢出的压缩数据块所对应的编码作为输出块。

结合上述的实施例,本方案能够两次向容器中添加符号数据,第一次向容器的剩余空间添加符号数据产生压缩输出块,是为了尽可能地利用动态huffman编码来压缩数据。第二次向容器的填充空间添加符号数据产生压缩输出块,是为了在第一次的压缩输出后还剩下的空间里,尽量多地塞进更多的压缩数据。

请参照图4和图6,在基于上述实施例中的基础上,所述选出输出模块,用于继续向容器的填充空间中添加符号数据,以最大压缩比编码输出填充块,其中,所述填充块为静态huffman编码、动态huffman编码以及原文件编码中任意一种。本实施例中,容器的填充空间的数据填充,也可以采用上述实施例的方案,请流程请参照上述的方案,此处不再赘述。应该指出的是,最后一个符号对应的在输入数据的偏移量被记录下来,用作分隔输入数据在两个容器的分界线。

以上所述仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是在本发明的发明构思下,利用本发明说明书及附图内容所作的等效结构变换,或直接/间接运用在其他相关的技术领域均包括在本发明的专利保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1