2015-11-24 2 views
1

У меня есть персональный проект, где я должен использовать zlib для распаковки некоторых данных. Я храню двоичные данные в std :: vector, где byte_t не является чем-то другим, кроме unsigned char.Boost Zlib не работает при декомпрессии

Так что я изменил функцию распаковывать ZLIB с их сайта выглядеть следующим образом: http://pastebin.com/spXcRyxa

Все шло отлично на около 90% теста, а затем разбить приложение (некоторые ошибки в addToVector - не смог найти).

Затем я помню, что у boost есть хорошая обертка для zlib. Я скомпилировал boost с zlib и искал, как это сделать с помощью std :: vector (почти все примеры были для std :: string). Но я нашел пример для bzip (Uncompress data in memory using Boost gzip_decompressor), затем я изменил некоторые вещи, чтобы заставить его работать;

std::vector<byte_t> unzip(const std::vector<byte_t> compressed) 
{ 
    std::vector<byte_t> decompressed = std::vector<byte_t>(); 

    boost::iostreams::filtering_ostream os; 

    os.push(boost::iostreams::zlib_decompressor()); 
    os.push(std::back_inserter(decompressed)); 

    boost::iostreams::write(os, reinterpret_cast<const char*>(&compressed[0]), compressed.size()); 

    return decompressed; 
} 

Мое изменение не соответствует всем тестам. Декомпрессированные данные из boost zlib примерно на 10 000 символов короче, чем обычная библиотека zlib.

Что я делаю неправильно в этой реализации zlib boost? Спасибо вам !

ответ

1

Действительно, ваш образец должен быть самодостаточным и воспроизводимым (легко, просто включите крошечный сжатый образец).

В отсутствии этого, вот мои два цента: убедитесь, что он покраснел. Самый простой способ заключается в том, чтобы закрыть поток до использования потопленных данных:

std::vector<byte_t> unzip(std::vector<byte_t> const& compressed) 
{ 
    std::vector<byte_t> decompressed = std::vector<byte_t>(); 

    { 
     boost::iostreams::filtering_ostream os; 

     os.push(boost::iostreams::zlib_decompressor()); 
     os.push(std::back_inserter(decompressed)); 

     boost::iostreams::write(os, reinterpret_cast<const char*>(&compressed[0]), compressed.size()); 
    } 

    return decompressed; 
} 

PS. Обратите внимание, как я беру сжатые данные на const&. Ваша функция скопировала бы вход перед распаковкой ...

+0

Он работает. Спасибо. Мне не нужно копировать данные, потому что после декомпрессии я не использую сжатые данные: D. –

+0

Вы должны неправильно прочитать мой комментарий о копировании входных данных – sehe

Смежные вопросы