千家信息网

gzip压缩文件损坏修复原理和数据恢复方法

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,接修复损坏的gzip压缩文件之原理篇,再次引用GZIP结构图:已知修复一个损坏的gzip文件的关键环节在于找到下一个正常压缩包的起始点。根据结构图中的信息可知,每个压缩包的开始结构中有是否到达尾部标志
千家信息网最后更新 2026年11月02日gzip压缩文件损坏修复原理和数据恢复方法

接修复损坏的gzip压缩文件之原理篇,再次引用GZIP结构图:

已知修复一个损坏的gzip文件的关键环节在于找到下一个正常压缩包的起始点。根据结构图中的信息可知,每个压缩包的开始结构中有是否到达尾部标志、使用的哈夫曼树类型、以及3个哈夫曼树的树元素个数等。如果某个gzip文件中间有一个坏扇区,要找到坏扇区后的一个正常起点,仅需按位右移,一直移位到可以正常解压的某个位,就可能找到了正确的压缩包起始。而根据gzip文件的压缩作业窗口为32KB大小推算,这个遍历不会超过64KB即可找到。在内存中快速循环可以很快找到,但需要有明确的判断错误的方法。
首先可以明确的是结尾标志,应该为0(我们是从损坏的点向后查)。而哈夫曼树类型也大致应该是动态哈夫曼(0x02),cl1的元素个数应该取值为257到286之间(包含边界),cl2的元素个数应小于等于30,ccl的元素个数取值可为1-15(包含边界)。
其实,还可以参考的东西有,解开的哈夫曼树是否异常,或者通过规律性原则找到最后一个取值为256的值,但这些算法应该是较为麻烦的,有上面的算法连续校验几个压缩块就足够了。
具体方法是对gzip的源码做修改,进行遍历。因时间关系,未做成通用工程,仅快速修改了部分代码。大致的修改点为:

一,找到损坏点:

在unzip.c中,
error("invalid compressed data--format violated");
这一行前,获取当前解码字节位置即可。

二、遍历找到损坏点:

1、inflate.c文件中,改

if (nl > 286 || nd > 30)#endifreturn 1;

为:

if (nl > 286 || nd > 30||nl <257 || nd <1)#endifreturn 1;

2、inflate.c文件中,在int inflate_block(e)函数中
在如下代码前

bb = b; bk = k;

加入代码:

if ((t != 2) || (*e != 0)) return 2;

3、inflate.c文件中,在int inflate_block(e)函数尾部
把if (t == 0) 与if (t == 1)的情况都直接返回错误值2。

4、inflate.c文件中,函数int inflate()中,改

if ((r = inflate_block(&e)) != 0) return r; end

为:

unsigned t;           /* block type */ register ulg b;       /* bit buffer */ register unsigned k;  /* number of bits in bit buffer */ while (inptr <= insize) {     unsigned int tptr = inptr;     unsigned int tbk = bk;     unsigned long tbb = bb;     unsigned int twp = wp;     long long tstart = *(long long*)(inbuf + tptr);     if ((r = inflate_block(&e)) != 0)     {         inptr = tptr;         bb = tbb;         bk = tbk;         wp = twp;         b = bb;         k = bk;         NEEDBITS(1)         DUMPBITS(1)     }     else     {         printf("get by www.datahf.net!"); //也可输出tstart,bb,bk 值,转载时请保留版权信息:www.datahf.net张宇     } } 

此4步完成后,试着调试这个错误的.gz文件,当然,也可以在代码中解释完头部结构后加一个seek,直接seek到损坏位置。
通常情况下,输出printf("get by www.datahf.net!")这行代码时,已经找到了正确的起始位。
找到起始位后,也可以构造或拷贝一个正常的gzip文件头,再拼接好找到的位流,即可解压了。(如果位流不是字节对齐的,可能要全部做位移)。拼接后很多压缩文件就可以打开甚至于解压了,不过,有可能会报错,主要是尾部的校验和大小错,其实可以忽略。
如果拼接好了linux下,不能直接用"gzip -d"解压,因其crc有错误,会导致解压到99%后报错,然后把文件删除,换成管道命令即可:

文件 代码 哈夫 哈夫曼 个数 元素 结构 错误 起始 函数 尾部 方法 位置 信息 大小 字节 情况 标志 算法 类型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡 科技互联网 天津市摩尔互联网科技 深圳九邦互联网科技有限公司 厦门中拓互联网络科技有限公司 华脉科技工业互联网产品 深圳市运趣互联网科技有限公司 江苏南京365互联网科技 创业天下互联网科技有限公司 受益于互联网科技的高速发展 岳阳华臻互联网科技有限公司 互联网保险科技创业 深圳市罗太互联网科技有限公司 互联网金融科技元年 智帮互联网科技公司最近动向 互联网科技手机排行榜 上海万顺科技互联网有限公司招聘 保山互联网科技靠谱吗 北京品多多互联网科技有限公司 网互联网络科技 湖北九亚互联网络科技有限公司 互联网科技公司名称 四个字互联网科技公司取名 成都玖崟互联网科技有限公司乐商圈怎么样 辽宁互联网新科技 天津腾达互联网科技有限公司 佛山市翊博互联网络科技有限公司 唯美互联网科技 伍佰万互联网科技是干嘛的 高科技和互联网的现代国家
0