在某些情况下,zLib inflate的结果为空

时间:2011-02-01 15:19:59

标签: c++ pdf zlib inflate compression

我的程序处理PDF文件并从中读取一些流。那里还有FlateEncoded流。我使用zlib的“inflate()”方法对它们进行解压缩。

这通常适用于以下代码:

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;
    }
}

但inflate对某些流有空的结果。它不常见,但它发生了。有人知道为什么吗?

流必须正常,因为所有PDF阅读器都能正确读取PDF文件。

感谢您的帮助!

更新

我上传了PDF和流,因此您可以自行查看。

PDF - &gt;流从字节43296开始

Stream

更新2

我将无法解压缩的流与可以解压缩的流进行比较。我注意到一件有趣的事情:工作流都以2字节H%开头。有问题的流以ö&gt;开头。现在有人这意味着什么吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

zlib似乎不支持PDF文件中找到的所有泄密流。