Распакуйте данные в памяти с помощью Boost gzip_decompressor
Я пытаюсь распаковать двоичные данные в памяти с помощью Boost gzip_decompressor
, Из этого ответа я адаптировал следующий код:
vector<char> unzip(const vector<char> compressed)
{
vector<char> decompressed = vector<char>();
boost::iostreams::filtering_ostream os;
os.push(boost::iostreams::gzip_decompressor());
os.push(boost::iostreams::back_inserter(decompressed));
boost::iostreams::write(os, &compressed[0], compressed.size());
return decompressed;
}
Однако возвращенный вектор имеет нулевую длину. Что я делаю неправильно? Я пробовал звонить flush()
в потоке ОС, но это не имеет значения
1 ответ
Ваш код работает для меня с этой простой тестовой программой:
#include <iostream>
#include <vector>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
std::vector<char> unzip(const std::vector<char> compressed)
{
std::vector<char> decompressed = std::vector<char>();
boost::iostreams::filtering_ostream os;
os.push(boost::iostreams::gzip_decompressor());
os.push(boost::iostreams::back_inserter(decompressed));
boost::iostreams::write(os, &compressed[0], compressed.size());
return decompressed;
}
int main() {
std::vector<char> compressed;
{
boost::iostreams::filtering_ostream os;
os.push(boost::iostreams::gzip_compressor());
os.push(boost::iostreams::back_inserter(compressed));
os << "hello\n";
os.reset();
}
std::cout << "Compressed size: " << compressed.size() << '\n';
const std::vector<char> decompressed = unzip(compressed);
std::cout << std::string(decompressed.begin(), decompressed.end());
return 0;
}
Вы уверены, что ваш вход был сжат с помощью gzip, а не каким-либо другим методом (например, raw deflate)? gzip сжатые данные начинаются с байтов 1f 8b
,
Я вообще пользуюсь reset()
или поместите поток и фильтры в их собственный блок, чтобы убедиться, что вывод завершен. Я сделал оба для сжатия выше, просто в качестве примера.