一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种破损压缩包修复方法及系统与流程

2022-02-22 17:53:05 来源:中国专利 TAG:


1.本公开属于压缩包修复技术领域,尤其涉及一种破损压缩包修复方法及系统。


背景技术:

2.本部分的陈述仅仅是提供了与本公开相关的背景技术信息,不必然构成在先技术。
3.修复损坏的压缩文件是数据安全检查领域的重要应用之一,zip格式存储文件是常用的压缩文件格式之一,广泛的应用在windows、linux、unix等操作系统中,随着计算机、互联网的快速发展,zip文件逐渐成为数据存储及传输的主流文件格式,然而由于磁盘损坏、网络传输、病毒破坏等原因,使存储在zip中的数据遭到损坏,导致很多用户丢失重要数据。
4.zip常见的损坏情况包括:文件字节的丢失(如网络传输、磁盘拷贝发生的错误)或者增加(病毒感染、错误io操作)等情况;发明人发现,对于zip文件的修复,现在最常用的修复方法大多采用基于文件头的修复方法,且集中于文件格式的修复,但是对于无文件头或数据缺失的情况无法进行有效修复。


技术实现要素:

5.本公开为了解决上述问题,提供了一种破损压缩包修复方法及系统,所述方案基于压缩包中文件数据头、核心目录区、文件尾部之间的关联数据特征,深入分析其内在关联性,通过对其相关性、匹配性进行有效分析,在无文件头或数据缺失的情况下,能有效恢复压缩包中的子文件。
6.根据本公开实施例的第一个方面,提供了一种破损压缩包修复方法,包括:
7.获取压缩包的文件结构数据,并判断文件结构的受损类型;
8.根据所述受损类型对文件结构进行预处理;
9.基于文件结构的多维度分析生成正确的文件结构,实现压缩包格式的修复;
10.基于修复后的压缩包格式,按照文件顺序进行子文件解压;其中,解压过程中根据压缩编码类型对子文件中的数据进行修复;
11.获得修复后的压缩文件。
12.进一步的,所述方法还包括对解压的文件数据进行crc校验,判断文件数据区与其核心目录区是否对应。
13.进一步的,所述根据压缩类型对子文件中的数据进行修复,具体为:对于huffman编码类型,基于huffman编码树计算文件数据区大小,并判断数据区是否存在字节增减,对增减的字节进行数据修剪或填充。
14.进一步的,所述多维度分析包括对文件结构数据的可信度分析、相关度分析以及匹配度分析。
15.根据本公开实施例的第二个方面,提供了一种破损压缩包修复系统,包括:
16.数据获取单元,其用于获取压缩包的文件结构数据,并判断文件结构的受损类型;
17.预处理单元,其用于根据所述受损类型对文件结构进行预处理;
18.文件格式修改单元,其用于基于文件结构的多维度分析生成正确的文件结构,实现压缩包格式的修复;
19.数据区修改单元,其用于基于修复后的压缩包格式,按照文件顺序进行子文件解压;其中,解压过程中根据压缩编码类型对子文件中的数据进行修复;
20.结果获取单元,其用于获得修复后的压缩文件。
21.根据本公开实施例的第三个方面,提供了一种电子设备,包括存储器、处理器及存储在存储器上运行的计算机程序,所述处理器执行所述程序时实现所述的一种破损压缩包修复方法。
22.根据本公开实施例的第四个方面,提供了一种非暂态计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现所述的一种破损压缩包修复方法。
23.与现有技术相比,本公开的有益效果是:
24.本公开专利从核心目录区入手深入分析各数据段之间的内在联系,对相关性、匹配性做最大分析及修复,实现了在无文件头或文件头数据缺失的情况下修复压缩包中子文件的目的。
25.本公开附加方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本公开的实践了解到。
附图说明
26.构成本公开的一部分的说明书附图用来提供对本公开的进一步理解,本公开的示意性实施例及其说明用于解释本公开,并不构成对本公开的不当限定。
27.图1为本公开实施例一中所述的zip文件格式示意图;
28.图2为本公开实施例一中所述的一种破损压缩包修复方法流程图;
29.图3为本公开实施例一中所述的压缩文件格式修复流程图;
30.图4为本公开实施例一中所述的数据区修复流程图;
31.图5为本公开实施例一中所述的文件头部的字段结构示意图;
32.图6为本公开实施例一中所述的核心目录区的字段结构示意图;
33.图7为本公开实施例一中所述的文件尾部的字段结构示意图;
34.图8为本公开实施例一中所述的zip格式压缩后的文件结构示意图。
具体实施方式
35.下面结合附图与实施例对本公开做进一步说明。
36.应该指出,以下详细说明都是示例性的,旨在对本公开提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本公开所属技术领域的普通技术人员通常理解的相同含义。
37.需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本公开的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包
括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。
38.在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。
39.实施例一:
40.本实施例的目的是一种破损压缩包修复方法。
41.一种破损压缩包修复方法,包括:
42.获取压缩包的文件结构数据,并判断文件结构的受损类型;
43.根据所述受损类型对文件结构进行预处理;
44.基于文件结构的多维度分析生成正确的文件结构,实现压缩包格式的修复;
45.基于修复后的压缩包格式,按照文件顺序进行子文件解压;其中,解压过程中根据压缩编码类型对子文件中的数据进行修复;
46.获得修复后的压缩文件。
47.具体的,为了便于理解,以下结合附图对本公开所述方案进行详细说明:
48.在本实施例中,以压缩了多个文档的zip压缩文件为例,对本公开所述方法进行说明,如图1所示,在压缩了多个文档的zip文件中,每个被压缩的文件都会带有一个本地文件头、核心目录区、文件数据区,这三个数据结构一一对应,其中本地文件头和核心目录区包含了对应的压缩文档基本信息,数据区则存储该文档压缩后的数据,zip文件尾部则包含了整个zip文件的基本信息。
49.如表1-表3分别展示了本地文件头、核心目录以及文件尾部的结构:
50.表1本地文件头结构
[0051][0052]
表2核心目录结构
[0053][0054]
表3文件尾部结构
[0055][0056]
基于上述表格中的文件格式可以看出,本地文件头、核心目录区、文件尾部之间有很强的关联性,如果文件数据区损坏或者丢失,可以很方便的从其他记录中恢复出来,本公开基于上述原理,提出一种破损压缩包修复方法,包括以下步骤:
[0057]
步骤1:数据提取,根据各个结构的标志位和在文件中的分布提取出需要的数据,对于受损的zip文件,其结构有可能丢失或者是伪结构。
[0058]
具体的,首先将本地文件头结构个数与核心目录结构个数对比,如果不相同,检查文件尾部结构中的文件个数字段,如果尾部丢失则查找数据块个数,判断是结构丢失或伪
装结构并进行相应处理。
[0059]
其中,存在结构丢失包括如下情况:
[0060]
从文件尾部结构中获得的文件个数大于本地文件头个数或核心目录结构个数;
[0061]
或,数据块个数大于本地文件头个数或核心目录结构个数。
[0062]
其中,存在伪装结构包括如下情况:
[0063]
从文件尾部结构中获得的文件个数小于本地文件头个数或核心目录结构个数;
[0064]
或,数据块个数小于本地文件头个数或核心目录结构个数。
[0065]
步骤2.数据预处理,清理噪声数据,对伪结构进行丢弃,全量填充丢失的数据结构。
[0066]
具体的,以zip数据头部为例,其头部结构具有明确的协议定义,比如zip文件头部为每一个压缩文件定义了结构local file header,具体结构如图5所示,获得zip文件之后,基于数据头部协议的定义分析该区段,比如文件头标识为固定值、解压文件所需最低版本等等,在修复过程中会预先设置一些常用值,发现无效数据之后会按标准格式进行填充,比如文件名长度填写100、文件名随机生成100字符的文件名,文件最后修改时间、文件最后修改日期等均用标准格式填充,扩展区全部用0字节填充,具体的填充内容可根据实际需求进行设定。
[0067]
步骤3.可信度分析:预先设定文件结构中不同字段中字节的取值范围(此处取值范围的设定根据zip格式标准文档中定义的范围进行设定),依据字节的取值范围对每个数据结构进行单独检查(比如zip压缩包的压缩版本、时间、压缩方法、文件长度等,而)。根据这些字节的取值范围,可以判断该字节的可信度,另外根据错误的连续性,如果一个结构中的某个字节错误,则该结构内的其他字节可信度较低。
[0068]
具体的,可信度计算依据为zip格式标准文档,zip压缩包数据结构有三大部分组成,即文件头、核心目录区、文件尾部区,如图5所示为文件头部的字段组成,如图6所示为核心目录区的字段结构,如图7所示为文件尾部的字段结构。
[0069]
zip压缩包中的每个子文件均独立压缩,每个子文件都会有文件头部及核心目录区数据结构,从zip压缩文件的0字节开始,分离出每个文件的对应的字段,例如:某一压缩文件中有1.txt、2.txt、3.txt,压缩后的文件格式如下图8所示,其中:
[0070]
对于文件中的每一字段,有以下形式的可信度计算方法:完全匹配、部分匹配、格式匹配。完全匹配的字段包括frsignature、frversion等,每一个文件区段的frsignature均为固定值;部分匹配下的字段比如文件头中的通用位标记(general purpose bit flag),该字段由2字节组成,字节中的每一位均有明确定义,如bit 0为是否加密、bit1、bit2为启用的压缩算法、bit7-bit11为未启用字段,该字段中的取值不做任何修复。格式匹配可信度分析,依据该字段的格式信息,比如文件最后修改时间、文件最后修改日期等。
[0071]
系统依次扫描zip压缩文件中的各个字段,依据可信度分析的结果,完全匹配下的由固定值替换、部分匹配的,修复字段中的关键位,格式匹配下的依据正确的格式,生成随机数据填充。
[0072]
步骤4.相关度分析:从zip文件格式部分可以看出本地文件头、核心目录、文件尾部结构三者之间具有很大的相关度,本地文件头和核心目录区结构中很多关键字节的数据完全相同,另外一些数据相互之间具有某些函数关系,再从各个结构在文件中的分布来看,
本地文件头分散于整个zip文件中,因此两个文件头的错误可以看为独立事件。本地文件头与相对应的核心目录分散存储,它们的错误可以看为独立事件,中央目录区和文件尾部结构集中存储于zip尾部,它们之间的错误具有较大的相关度。根据以上数据的相关度和可信度,针对相关字节进行对照检查,如果各个结构中的相关数据可信度均为零,则写入最大可能值。
[0073]
其中,可信度基于字段的独立判断,可信度分析过程中依据分析结果进行了一部分的修复工作,而相关度计算需要综合文件头、核心目录区、尾部区域进行综合判断,比如文件头部中的压缩后的大小(compressed size)、未压缩的大小(uncompressed size)。
[0074]
进一步的,所述最大可能值依据字段不同,取值不同,在独立的区段中如文件头部中的通用比特标志位字段,bit0处,其最大可能值为“1”;bit1、bit2表示压缩算法,其最大可能值为“01”;相关性字段中的压缩前大小、压缩后大小、文件名长度字段,需要读取核心目录区中的关联字段作为最大可能值。
[0075]
步骤5.匹配度分析:如果一个核心目录与一个本地文件头完全匹配(即对应字节完全相等),断定它们互相匹配;如果一个核心目录与一个本地文件头关键字节有一个完全匹配(如crc、文件名等)则确定它们互相匹配。
[0076]
具体的,zip压缩文件的结构与其他压缩文件不同,zip压缩文件是针对每个子文件单独压缩,每个子文件均有文件头、核心目录区结构,以上述的压缩文件为例,一个压缩包中,存在1.txt、2.txt、3.txt。压缩后的文件结构如下图8所示,由图8中可以看出,正常的zip压缩文件均有,文件头、核心目录区结构,对于文件1.txt来说,很多字段是一一对应的,如char frsignature[4]、uint frcompressedsize、uint fruncompressedsize、ushort frfilenamelength等。这是匹配度计算的理论依据,如果文件头、核心目录区的对应字段完全相同,则被破坏的可能性极低,可以判断为互相匹配;同时,若核心目录与一个本地文件头关键字节有一个完全匹配,由于关键字节(包括crc、文件名等)相等可以认定为两种结构属于同一文件,故也可以判断两个结构相互匹配。
[0077]
步骤6.计算验证:根据本地文件头的文件名长度、扩展区长度、文件压缩后大小计算出两个相邻结构之间的距离。根据核心目录和尾部结构的偏移字节查找相应的结构位置(例如:由于zip文件中的文件是独立压缩,每个子文件均有相应的文件头、核心目录区结构,从文件头部中读取文件名长度、扩展区长度、文件压缩后大小,即可确定核心目录区的位置),判断文件长度是否修改(增加或减少字节),同时通过查找该偏移值判断字节正确性。通过计算验证并改写各个结构中对应的字节。
[0078]
步骤7.生成正确结构:将经过修复的各个结构和数据区相对应,重新生成各个结构,完成zip格式的修复,其修复流程如图3所示。
[0079]
步骤8.对于zip数据区内容修复,重复步骤1-7(此处的目的是对每个子文件对应的各个结构均进行修复),分离并隔离不同的子数据块,按照文件顺序依次解压子文件。
[0080]
步骤9.计算子数据块压缩时生成的huffman编码树计算出子数据块大小,该大小与前步骤中修复的文件大小比对,确定该数据块是否有字节增加或减少,对其进行必要的数据修剪与填充,其中,所述数据修剪为删除多余字节,所述填充采用随机数填充。
[0081]
步骤10.计算解压数据的crc32编码,并将得出的crc32编码与文件目录结构中的crc比对,判断该数据区是否出现文件错误。
[0082]
其中,此处有两种情况,核心目录区中的crc32如果与计算获得的crc32完全一致,此文件未出现错误,可以直接解压缩,如果不同,则只能达到部分修复的目的,对于文件数据区错误的情况可以最大限度的恢复出未受损的数据。
[0083]
步骤11.重复步骤8-10依次解压出来zip压缩包中的子文件,其具体流程如图4所示。
[0084]
实施例二:
[0085]
本实施例的目的是一种破损压缩包修复系统。
[0086]
一种破损压缩包修复系统,包括:
[0087]
数据获取单元,其用于获取压缩包的文件结构数据,并判断文件结构的受损类型;
[0088]
预处理单元,其用于根据所述受损类型对文件结构进行预处理;
[0089]
文件格式修改单元,其用于基于文件结构的多维度分析生成正确的文件结构,实现压缩包格式的修复;
[0090]
数据区修改单元,其用于基于修复后的压缩包格式,按照文件顺序进行子文件解压;其中,解压过程中根据压缩编码类型对子文件中的数据进行修复;
[0091]
结果获取单元,其用于获得修复后的压缩文件。
[0092]
在更多实施例中,还提供:
[0093]
一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成实施例一中所述的方法。为了简洁,在此不再赘述。
[0094]
应理解,本实施例中,处理器可以是中央处理单元cpu,处理器还可以是其他通用处理器、数字信号处理器dsp、专用集成电路asic,现成可编程门阵列fpga或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0095]
存储器可以包括只读存储器和随机存取存储器,并向处理器提供指令和数据、存储器的一部分还可以包括非易失性随机存储器。例如,存储器还可以存储设备类型的信息。
[0096]
一种计算机可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成实施例一中所述的方法。
[0097]
实施例一中的方法可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器、闪存、只读存储器、可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。为避免重复,这里不再详细描述。
[0098]
本领域普通技术人员可以意识到,结合本实施例描述的各示例的单元即算法步骤,能够以电子硬件或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。
[0099]
上述实施例提供的一种破损压缩包修复方法及系统可以实现,具有广阔的应用前景。
[0100]
以上所述仅为本公开的优选实施例而已,并不用于限制本公开,对于本领域的技术人员来说,本公开可以有各种更改和变化。凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献