使用 ZLIB 解压 出现 Z_DATA_ERROR 的错误排查 zlib data_error

           这两天在设计实现一个APP安装包时,发现ZLIB解压一直出现Z_DATA_ERROR错误。查找了不少资料,没发现错误原因。一度怀疑是ZLIB的一个BUG。最后发现是自己的疏忽,惭愧得很。记录在此,希望也能帮到有需要的人。

压缩时,被压缩的数据写入到文件中是使用的ofstream,使用的是以下的代码:

ofstream ofs(fp, ios::out | ios::binary);
if(ofs.is_open())
{
ofs.write((char*)uncompressdata + writen_len, strtoi(siz));
}

而当读取压缩后的数据时,使用的是ifstream,使用的是以下的代码:

ifstream ifs;
ifs.open(path.c_str());
if(!ifs.is_open())
{
// 文件打开失败
return false;
}

ifs.write ......

乍一看好像没什么问题,但仔细对比,发现构造ifstream对象时,并没有将ios::in | ios::binary传入。导致的问题就是,写入的数据与读取的数据有细节是有出入。将构造方法改一下就好了。

改成如下代码:

ifstream ifs(path.c_str(),ios::in | ios::binary);

或者改成以下这样:

ifstream ifs;
ifs.open(path.c_str(),ios::in | ios::binary);


通过这个问题得出的一个警示:

写文件与读文件,最好采用相同的读取方式才能保证从文件中读取出来的数据与写入到文件中的数据完全一致。特别是对ZLIB这种库,任何一个字节不一致,都会导致错误发生。



PS:原创,转载请注明出处。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值