DEFLATE アルゴリズムを使用して圧縮されたファイルを解凍し、vector<unsigned char>
. 私がこれまでに行った調査から、 a を使用しboost::iostreams::filtering_streambuf
、それを使用boost::iostreams::copy()
して a に取得しboost::interprocess::basic_vectorstream<std::vector<unsigned char>>
、基になるベクトルを vectorstream から引き出すことができるように思えました。ただし、次のようなコンパイラ エラーが大量に発生します。
/usr/include/boost/iostreams/copy.hpp: In function ‘std::streamsize boost::iostreams::detail::copy_impl(Source, Sink, std::streamsize) [with Source = boost::reference_wrapper<boost::iostreams::filtering_streambuf<boost::iostreams::input> >, Sink = boost::reference_wrapper<boost::interprocess::basic_vectorstream<std::vector<unsigned char> > >, std::streamsize = long int]’:
/usr/include/boost/iostreams/copy.hpp:245:79: instantiated from ‘std::streamsize boost::iostreams::copy(Source&, Sink&, std::streamsize, typename boost::enable_if<boost::iostreams::is_std_io<Source> >::type*, typename boost::enable_if<boost::iostreams::is_std_io<Sink> >::type*) [with Source = boost::iostreams::filtering_streambuf<boost::iostreams::input>, Sink = boost::interprocess::basic_vectorstream<std::vector<unsigned char> >, std::streamsize = long int, typename boost::enable_if<boost::iostreams::is_std_io<Source> >::type = void, typename boost::enable_if<boost::iostreams::is_std_io<Sink> >::type = void]’
ValueFileReader.cpp:92:41: instantiated from here
/usr/include/boost/iostreams/copy.hpp:178:5: error: static assertion failed: "(is_same<src_char, snk_char>::value)"
私が使用しているコードは以下のとおりです (ここでは簡潔にするために短縮して「名前空間を使用する」ことを行っています)。
using namespace boost::iostreams;
using namespace boost::interprocess;
filtering_streambuf<input> in;
std::ifstream file(filename, std::ifstream::in);
in.push(zlib_decompressor());
in.push(file);
basic_vectorstream<std::vector<unsigned char>> vectorStream;
copy(in, vectorStream);
std::vector<unsigned char> chars(vectorStream.vector());
このスレッドを見たことがありますが、すべてをベクターにコピーするかどうかはわかりませんでした。ベクターから解凍することが最も効率的な方法です。
これについて私ができるより良い方法はありますか、それとも正しい考えを持っていますが、コードにエラーがありますか?