2

Boost を使用してメモリ内のバイナリ データを解凍しようとしていますgzip_decompressorこの回答から、次のコードを適応させました。

vector<char> unzip(const vector<char> compressed)
{
    vector<char> decompressed = vector<char>();

    boost::iostreams::filtering_ostream os;

    os.push(boost::iostreams::gzip_decompressor());
    os.push(boost::iostreams::back_inserter(decompressed));

    boost::iostreams::write(os, &compressed[0], compressed.size());

    return decompressed;
}

ただし、返されるベクトルの長さはゼロです。私は何を間違っていますか?OSストリームで呼び出しflush()てみましたが、違いはありませんでした

4

1 に答える 1

3

あなたのコードは、この簡単なテスト プログラムで動作します。

#include <iostream>
#include <vector>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>

std::vector<char> unzip(const std::vector<char> compressed)
{
   std::vector<char> decompressed = std::vector<char>();

   boost::iostreams::filtering_ostream os;

   os.push(boost::iostreams::gzip_decompressor());
   os.push(boost::iostreams::back_inserter(decompressed));

   boost::iostreams::write(os, &compressed[0], compressed.size());

   return decompressed;
}

int main() {
   std::vector<char> compressed;
   {
      boost::iostreams::filtering_ostream os;
      os.push(boost::iostreams::gzip_compressor());
      os.push(boost::iostreams::back_inserter(compressed));
      os << "hello\n";
      os.reset();
   }
   std::cout << "Compressed size: " << compressed.size() << '\n';

   const std::vector<char> decompressed = unzip(compressed);
   std::cout << std::string(decompressed.begin(), decompressed.end());

   return 0;
}

入力が gzip で圧縮されており、他の方法 (例: raw deflate) ではありませんか? gzip 圧縮データは bytes で始まります1f 8b

私は通常reset()、出力が完全であることを確認するために、ストリームとフィルターを独自のブロックで使用または配置します。例として、上記の圧縮のために両方を行いました。

于 2013-05-22T14:00:45.153 に答える