ブースト iostream と gzip を使用して配列内のデータを圧縮しようとしています。これが私のコードです。
struct String_sink : public boost::iostreams::sink
{
std::string& s;
String_sink(std::string& s):s(s){}
std::streamsize write(const char* s, std::streamsize n)
{
this->s.append(s, n);
return n;
}
};
boost::iostreams::stream< boost::iostreams::array_source > source ((char*)dataBitstream.GetData(), dataBitstream.GetNumberOfBytesUsed());
std::string compressed;
boost::iostreams::filtering_streambuf<boost::iostreams::input> outStream;
outStream.push(boost::iostreams::gzip_compressor(1));
outStream.push(source);
boost::iostreams::copy(outStream, String_sink(compressed));
これによりデータが圧縮されますが、テキストとして実行されます。私はバイナリでそれをしたい。その理由は、フラグを使用して「dataBitstream」をファイルに保存し、gzip.exe を使用してios_base::binary
ファイルを圧縮すると、結果のサイズがコードで得られるサイズよりも 50% 小さくなるためです。どちらの場合も、圧縮レベルとして「1」を使用しています。バイナリ フラグがないと、ファイルは実際にコードで表示されるサイズと同じサイズに圧縮されます。
では、配列をバイナリとして圧縮する方法を知っている人はいますか? これまでのところ、フラグ付きの stringstream を入力として使用し、関数std::stringstream::binary
を呼び出す stringstream out のシンクを作成してみました。read()
これはうまくいきませんでした。
配列をバイナリデータとして強制的に圧縮することは可能ですか??