1

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());

このスレッドを見たことがありますが、すべてをベクターにコピーするかどうかはわかりませんでした。ベクターから解凍することが最も効率的な方法です。

これについて私ができるより良い方法はありますか、それとも正しい考えを持っていますが、コードにエラーがありますか?

4

1 に答える 1

4

問題は、あなたifstreamとがその基になる文字型としてfiltering_streambuf使用されているが、あなたがその値型として使用されていることです。Boost コードには、変換できない 2 つの異なる型を使用した場合にコンパイラ エラーが発生しないように、これらの型が同じであることを要求する静的アサーションがあります。charbasic_vectorstreamunsigned char

幸いなことに、ここでの修正は簡単です。次のように変更します。

basic_vectorstream<std::vector<unsigned char>> vectorStream;
copy(in, vectorStream);
std::vector<unsigned char> chars(vectorStream.vector());

に:

basic_vectorstream<std::vector<char>> vectorStream;
copy(in, vectorStream);
std::vector<unsigned char> chars(
    vectorStream.vector().begin(),
    vectorStream.vector().end()
);

charunsigned charは C++ 標準によって同じオブジェクト表現を持つことが保証されているため (§3.9.1/1)、これは安全です。


直接の問題とは関係ありませんが、のコンストラクターにも渡す必要がありstd::ios::binaryますfile。そうしないと、行末の変換によりデータが破損します。

于 2012-09-18T22:51:14.500 に答える