我的程序处理PDF文件并从中读取一些流。那里还有FlateEncoded流。我使用zlib的“inflate()”方法来解压缩它们。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;
}
}
但膨胀有一些流空的结果。这不是经常发生,但它发生了。有人知道为什么吗?
流必须正确,因为所有PDF阅读器都能正确读取PDF文件。
感谢您的帮助!
UPDATE
我已上载的PDF和流这样你就可以自己检查一下。
PDF - >的流开始于字节43296
UPDATE 2
我比较了这不容与可被解压缩的数据流进行解压缩的数据流。我注意到一件有趣的事情:工作流都以2个字节H%开始。有问题的流以ö>开头。现在有人说这是什么意思吗?
感谢您的帮助!
“膨胀有空结果”是什么意思? (我猜这是膨胀返回0,但你不检查任何膨胀调用的返回值,你**绝对应该**) – nos 2011-02-01 15:24:04
这意味着当我膨胀一些数据时,流的值.total_out是0,这意味着没有输出 - >返回的字符串的长度也是0。 – 2011-02-01 15:28:51
你有多确定输入实际上是“可充气的”?你有没有尝试输出到文件并通过命令行确认输入实际上是有效的?另外,`inflate()`的返回值是多少? – JaredC 2011-02-01 15:32:50