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的话)
附解压缩函数源代码: