2011-02-01 12 views
1

私のプログラムは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

Stream

UPDATE 2

から始まります。私は面白いことに気づいた:作業ストリームはすべて2バイトH%で始まる。問題のあるストリームはö>で始まります。誰が今これは何を意味しますか?

ありがとうございました!

+0

「空の結果があります」とはどういう意味ですか? (私はそれが0を返すinflateだったと思うだろうが、あなたは**絶対に**すべきinflate呼び出しの戻り値をチェックしない) – nos

+0

これは、私がいくつかのデータを膨らませるとき、ストリームの値.total_outは0です。つまり、出力はありません - >返される文字列の長さも0です。 –

+0

入力が実際に「膨張可能」であることを確認してください。あなたはファイルに出力しようとしましたが、入力が実際に有効であることをコマンドラインで確認しましたか?また、 'inflate()'の戻り値は何ですか? – JaredC

答えて

0

zlibは、PDFファイルにあるすべての圧縮されたストリームをサポートしていないようです。

+2

それは確かにそれほど単純ではありません!つまり、それはあなたの質問ですが、あなたはそれを答えることはできますが、それは本当に質問に答えるものではありません(つまり、なぜですか?)。 – patrickvacek

2

各繰り返しでストリームを再初期化しないでください。ループの前に初期化し、ループ内にinflate()を呼び出すと、Z_OKまたはZ_STREAM_ENDが返されます。

+0

あなたは正しい!これは問題とは関係がなくても、チップをありがとう); –

+0

@FlashFan:私はあなたの問題に関連していることはほとんど確信しています。各反復で同じデータをフィードしようとします。 – sharptooth

+0

私はすでにそれをやりました。しかし、最初に呼び出されるときにZ_DATA_ERRORを返します。 –

関連する問題