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

来源:互联网 发布:软件开发需求阶段 编辑:程序博客网 时间:2024/06/08 05:04

           这两天在设计实现一个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 0