В некоторых случаях zLib inflate имеет пустой результат - PullRequest
1 голос
/ 01 февраля 2011

Моя программа обрабатывает PDF-файлы и считывает из них несколько потоков.Там также есть потоки, закодированные в FlateEncoded.Я использую метод "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;
    }
}

Но у inflate есть пустой результат для некоторых потоков.Это не часто, но так бывает.У кого-нибудь есть идея, почему?

Потоки должны быть в порядке, потому что все читатели PDF правильно читают файлы PDF.

Спасибо за помощь!

ОБНОВЛЕНИЕ

Я загрузил PDF и поток, чтобы вы могли проверить его самостоятельно.

PDF -> Поток начинается с байта 43296

Поток

ОБНОВЛЕНИЕ 2

Я сравнил потоки, которые не могут быть распакованы, с потоками, которые можно распаковать.Я заметил интересную вещь: все рабочие потоки начинаются с 2 байтов H%.Проблемные потоки начинаются с ö>.Кто-нибудь сейчас что это значит?

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

Не следует повторно инициализировать поток на каждой итерации.Инициализируйте его перед циклом и вызывайте inflate() внутри цикла, пока он не вернет либо Z_OK, либо Z_STREAM_END.

0 голосов
/ 19 мая 2011

zlib просто не поддерживает все дефлированные потоки в файлах PDF.

...