我的程序處理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