повысить проблему Iostream - PullRequest
2 голосов
/ 22 марта 2011

Я пытаюсь распаковать строку gzip'd в boost, используя следующий код

std::string DecompressString(const std::string &compressedString)
{
    std::stringstream src(compressedString);
    if (src.good())
    {
    boost::iostreams::filtering_streambuf<boost::iostreams::input> in(src);
    std::stringstream dst;
    boost::iostreams::filtering_streambuf<boost::iostreams::output> out(dst);
    in.push(boost::iostreams::zlib_decompressor());

    boost::iostreams::copy(in, out);
    return dst.str();
    }
    return "";

}

однако, всякий раз, когда я вызываю эту функцию (например, ниже)

string result = DecompressString("H4sIA");
string result = DecompressString("H4sIAAAAAAAAAO2YMQ6DMAxFfZnCXOgK9AA9ACsURuj9N2wpkSIDootxhv+lN2V5sqLIP0T55cEUgdLR48lUgToTjw/5zaRhBuVSKO5yE5c2kDp5zunIaWG6mz3SxLvjeX/hAQ94wAMe8IAHPCwyMS9mdvYYmTfzdfSQ/rQGjx/t92A578l+T057y1Ff6NW51Uy0h+zkLZ33ByuPtB8IuhdcnSMIglgm/r15/rtJctlf4puMt/i/bN16EotQFgAA");

программа всегда будет сбой в этой строке

in.push(boost::iostreams::zlib_decompressor());

и сгенерировать следующее исключение

Unhandled exception at 0x7627b727 in KHMP.exe: Microsoft C++ exception: 
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::logic_error> > at memory location 0x004dd868..

Я действительно понятия не имею об этом ... у кого-нибудь есть предложения?

Спасибо

EDIT:

Следуя предложению, я переключаю код на

 boost::iostreams::filtering_streambuf<boost::iostreams::input> in;//(src);

    in.push(boost::iostreams::zlib_decompressor());
    in.push(src);
     std::stringstream dst;
    boost::iostreams::filtering_streambuf<boost::iostreams::output> out;//(dst);
    out.push(dst);
    boost::iostreams::copy(in, out);

однако, исключение все еще происходит, за исключением того, что теперь происходит при копировании

Ответы [ 2 ]

1 голос
/ 17 февраля 2013

После следования совету brado86 измените zlib_decompressor() на gzip_decompressor()

1 голос
/ 22 марта 2011

Похоже, что вы нажимаете свои фильтры в неправильном порядке для.

Из того, что я могу понять из документации Boost.Iostreams, для ввода данные проходят через фильтры в обратном порядке, в котором вы вставили фильтры. Поэтому, если вы измените следующие строки следующим образом, я думаю, что должно работать.

Изменение

boost::iostreams::filtering_streambuf<boost::iostreams::input> in(src);
std::stringstream dst;
boost::iostreams::filtering_streambuf<boost::iostreams::output> out(dst);
in.push(boost::iostreams::zlib_decompressor());

до

boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
in.push(boost::iostreams::zlib_decompressor());
in.push(src);        // Note the order of pushing filters into the instream.
std::stringstream dst;
boost::iostreams::filtering_streambuf<boost::iostreams::output> out(dst);

Для получения дополнительной информации читайте Документация Boost.Iostreams .

...