10

Boostサイトの例に示されているように、ファイルのgzip/zlib解凍を実装しました。

void CompressionUtils::Inflate(std::ifstream& inputFile,
                               std::ofstream& outputFile)
{
   boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
   in.push(boost::iostreams::gzip_decompressor());
   in.push(inputFile);
   boost::iostreams::copy(in, outputFile);
}

これは正常に機能します。また、同様に圧縮されたRESTベースのJSONサービスから取得しているソケットからデータを読み取っています。私はメモリベースの実装を書くと思いましたが、それはどれほど難しいことでしょうか。さて、私は私がすべきようにストリームとストリームバッファを理解していないことがわかりました。私はここ数年Javaで責任を負っています;)..それで私はこの道を歩み始めました。

void CompressionUtils::Inflate(char* compressed, 
                               int size,
                               char* decompressed)
{

   boost::iostreams::stream<boost::iostreams::array_source> source(compressed,size);
   //std::stringstream str;

   boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
   in.push(boost::iostreams::gzip_decompressor());
   in.push(source);
   //boost::iostreams::copy(in, str);   
}

しかし、基本的に解凍されたストリームの解凍された表現を取得するためにどのような種類のストリームを使用できるかについて、私は途方にchar*暮れています。これは簡単なはずで、おそらくそうですが、私はここ数時間、失敗した試みを考え出すのに無駄にしています。

4

1 に答える 1

6

明らかに、ストリームのフィルタリングとストリーム バッファに出くわしました。同じメソッドを逆に使用して、データを文字列に取得できます。

私自身の例が手元にないので、これは疑似コードだと考えてください。しかし、これはあなたが探しているものであるはずです:

namespace io = boost::iostreams; //<-- good practice
typedef std::vector<char> buffer_t;

void CompressionUtils::Inflate(const buffer_t &compressed,
                               buffer_t &decompressed)
{
    io::filtering_ostream os;

    os.push(io::gzip_decompressor());
    os.push(io::back_inserter(decompressed));

    io::write(os, &compressed[0], compressed.size());
}

そのため、Boost が提供するバック インサーターを使用できます。

基本的に、上記のコードが行うことは、書き込み可能な出力ストリームを定義することです。これは、書き込まれたすべてのコンテンツが最初に によって解凍されgzip次にback_inserters が行うように、バッファback_inserterの後ろに挿入される に追加されるように設定されています。decompressed

また、ご覧のとおり、バッファは でラップされていstd::vectorます。これがうまくいくかどうか教えてください。

于 2012-02-19T13:47:52.447 に答える