私のプログラムはPDFファイルを処理し、いくつかのストリームを読み込みます。 FlateEncodedストリームもそこにあります。 zlibの "inflate()"メソッドを使用して、それらを解凍します。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;
}
}
しかし膨らませるいくつかのストリームのための空の結果を持っています。それは頻繁ではありませんが、起こります。なぜ誰かにアイデアはありますか?
すべてのPDFリーダーがPDFファイルを正しく読み取るため、ストリームは正常でなければなりません。
ありがとうございました!
UPDATE
あなた自身でそれを確認することができますので、私は、PDFやストリームをアップロードしました。
PDF - >ストリームはIを解凍することができるストリームで解凍するcan'tストリームを比較バイト43296
UPDATE 2
から始まります。私は面白いことに気づいた:作業ストリームはすべて2バイトH%で始まる。問題のあるストリームはö>で始まります。誰が今これは何を意味しますか?
ありがとうございました!
「空の結果があります」とはどういう意味ですか? (私はそれが0を返すinflateだったと思うだろうが、あなたは**絶対に**すべきinflate呼び出しの戻り値をチェックしない) – nos
これは、私がいくつかのデータを膨らませるとき、ストリームの値.total_outは0です。つまり、出力はありません - >返される文字列の長さも0です。 –
入力が実際に「膨張可能」であることを確認してください。あなたはファイルに出力しようとしましたが、入力が実際に有効であることをコマンドラインで確認しましたか?また、 'inflate()'の戻り値は何ですか? – JaredC