0

ブースト 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()これはうまくいきませんでした。

配列をバイナリデータとして強制的に圧縮することは可能ですか??

4

1 に答える 1

0

私はこの行を見ています:

outStream.push(boost::iostreams::gzip_compressor(1)); 

そして、 Boost の gzip 機能に関して Google で検索したドキュメントと比較します。

basic_gzip_compressor( const gzip_params& = zlib::default_compression, 
                       std::streamsize buffer_size = default value );

つまり、圧縮値 1 を指定しています。これが最低の設定です (つまり、圧縮量が最小になります)。デフォルト値 (単純な gzip.exe コマンド ラインの場合に使用) は 5 です。それか 9 を使用してみてください (さらに多くの圧縮が保証されるわけではありませんが、より多くの時間とメモリを使用する可能性があります)。

この場合、テキストとバイナリで違いが生じるとは思いません。

于 2013-03-12T01:35:44.000 に答える