2

(固定長の) 文字列を圧縮してから、圧縮した長さを比較する必要があります (データの冗長性のプロキシとして、またはコルモゴロフの複雑さの大まかな近似として)。現在、圧縮にboost::iostreamsを使用していますが、うまく機能しているようです。ただし、圧縮データのサイズを取得する方法がわかりません。誰か助けてくれませんか?

コードスニペットは

#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/filesystem.hpp>
#include <string>
#include <sstream>

namespace io = boost::iostreams;

int main() {

  std::string memblock;

  std::cout << "Input the string to be compressed:";
  std::cin >> memblock;

  std::cout << memblock << std::endl;

  io::filtering_ostream out;
  out.push(io::gzip_compressor());
  out.push(io::file_descriptor_sink("test.gz"));
  out.write (memblock.c_str(), memblock.size());

  std::cout << out.size() << std::endl;

  return 0;

}
4

3 に答える 3

6

boost::iostreams::counterコンプレッサーとシンクの間のチェーンに追加してから、そのcharacters()メンバーを呼び出して、それを通過したバイト数を取得できます。

これは私のために働く:

#include <boost/iostreams/filter/counter.hpp>

...

io::filtering_ostream out;
out.push(io::counter());
out.push(io::gzip_compressor());
out.push(io::counter());
out.push(io::file_descriptor_sink("test.gz"));
out.write (memblock.c_str(), memblock.size());
io::close(out); // Needed for flushing the data from compressor

std::cout << "Wrote " << out.component<io::counter>(0)->characters() << " bytes to compressor, "
    << "got " << out.component<io::counter>(2)->characters() << " bytes out of it." << std::endl;
于 2012-10-22T05:13:42.163 に答える
1

私は、圧縮された文字列の長さを実現するためのさらに別の (そして少し洗練された) 方法を考え出しました。ここで共有すると思いましたが、基本的には、圧縮されていない文字列をフィルター処理されたバッファーに渡し、出力を文字列にコピーするだけです。

template<typename T>
inline std::string compressIt(std::vector<T> s){

    std::stringstream uncompressed, compressed;
    for (typename std::vector<T>::iterator it = s.begin();
         it != s.end(); it++)
        uncompressed << *it;

    io::filtering_streambuf<io::input> o;
    o.push(io::gzip_compressor());
    o.push(uncompressed);
    io::copy(o, compressed);

    return compressed.str();
}

後で、圧縮された文字列のサイズを次のように簡単に取得できます。

compressIt(uncompressedString).size()

以前のように出力ファイルを作成する必要がないので、より良いと思います。

乾杯、ニキル

于 2012-10-27T09:32:10.063 に答える
0

もう1つの方法は

stream<array_source> input_stream(input_data,input_data_ize);
stream<array_sink> compressed_stream(compressed_data,alloc_compressed_size);  
filtering_istreambuf out;
out.push(gzip_compressor());
out.push(input_stream);
int compressed_size = copy(out,compressed_stream);
cout << "size of compressed_stream" << compressed_size << endl;
于 2016-02-01T21:07:12.563 に答える