zlib解压缩时对破损数据的处理

zlib解压缩的时候碰到数据截断怎么办?

最近碰到了一个问题,被zlib压缩的数据的前段数据丢失,导致后续数据无法解压缩,但经过实验,发现zlib已经提供的很强的容错能力,问题最终解决。

 

实验过程举例如下:

 

方式1:使用Z_SYNC_FLUSH参数分段压缩,整体解压缩

 

 

解压缩成功。

 

方式2:使用Z_PARTIAL_FLUSH参数分段压缩,整体解压缩

(代码同方式1)

解压缩成功

 

方式3:使用Z_PARTIAL_FLUSH参数分段压缩,同时解压缩

 

 

解压缩成功

 

 

方式4:使用Z_SYNC_FLUSH参数分段压缩,同时解压缩

 

(代码同上)

解压缩成功

 

 

 

方式5:使用Z_SYNC_FLUSH参数分段压缩,之后从中间解压缩

 

 

 

 

 

 

解压缩失败,错误信息:

buffer_uncompress: inflate returned -3

解压缩方法改为:

 

status = inflateSync(&incoming_stream);

status = inflate(&incoming_stream, Z_SYNC_FLUSH); 

解压缩成功,得到了从截断处开始的数据

 

 

 

方式6:同方式4,但解压缩前执行inflateSync

 

解压缩出错,错误信息:Illegal seek

 

由此可见,inflateSync可以处理数据截断的问题,但是只有确定数据是截断的才能调用。

另外在截断的数据的前面附加0x78,0x9c或者0x0,0x0,0xFF,0xFF也可以实现正常解压缩。

0x78,0x9c是zlib数据头(非固定,参考RFC 1951),而00 00 FF FF是zlib容错方式的数据块头。

又经多次实验,发现zlib压缩的特点,是可以逐块压缩,逐块解压缩;或者整体压缩,然后逐块解压缩;

但是不能逐块压缩,然后跨块解压缩。(不inflateSync的话)

 

 

 

附解压缩函数源代码:

 

 

编译方法:
gcc -lz compress.c stream_test.c -g

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值