zlib的充气具有空的结果在某些情况下,(zLib inflate has empty result

2019-09-30 18:47发布

我的程序处理PDF文件,并读一些流了出来。 有在那里也FlateEncoded流。 我使用zlib的“充气()”的方法来解压缩。

这通常作品真的很好用下面的代码:

static string FlateDecode(string s){

    int factor = 50;
    z_stream stream;
    while(true){
        char * out = new char[s.length()*factor];           

        stream.zalloc = Z_NULL;
        stream.zfree = Z_NULL;
        stream.opaque = Z_NULL;
        stream.avail_in = s.length();
        stream.next_in = (Bytef*)s.c_str();
        stream.avail_out = s.length()*factor;
        stream.next_out = (Bytef*)out;
        inflateInit(&stream);
        inflate(&stream, Z_FINISH);
        inflateEnd(&stream);


        if(stream.total_out >= factor*s.length()){
            delete[] out;
            factor *= 2;
            continue;

        }
        string result;
        for(unsigned long i = 0; i < stream.total_out; i++){
            result += out[i];
        }

        delete[] out;
        return result;
    }
}

但充气有一些流空的结果。 不经常It's,但它发生。 有一个人一个想法,为什么?

因为所有的PDF阅读器正确读取PDF文件的流必须是好的。

谢谢你的帮助!

UPDATE

我上传的PDF和流这样你就可以自己检查一下。

PDF - >流开始于43296字节

更新2

我是比较有不容可以解压缩流进行解压缩的流。 我注意到一件有趣的事:工作流中的所有用2个字节H%开始。 有问题的数据流带O开始>。 现在有没有人这是什么意思?

谢谢你的帮助!

Answer 1:

你不应该重新初始化在每次迭代流。 在循环之前初始化并调用inflate()的循环内,直到它返回要么Z_OKZ_STREAM_END



Answer 2:

zlib的根本似乎不支持在PDF文件中找到的所有瘪流。



文章来源: zLib inflate has empty result in some cases