Rob*_*win 10 c++ boost gzip zlib boost-iostreams
我实现了文件的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);
}
Run Code Online (Sandbox Code Playgroud)
这很好用.我也是从一个套接字读取数据,我从一个基于休息的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);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道我可以使用哪种流来基本上获得解char*
压缩流的解压缩表示.这应该很容易,而且很可能是,但是我在过去的几个小时里一直在浪费不成功的尝试.
显然,您遇到了过滤流和流缓冲区.您可以反向使用相同的方法将数据转换为字符串.
我没有自己的示例,所以请考虑这是一些伪代码,但这应该是你正在寻找的:
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());
}
Run Code Online (Sandbox Code Playgroud)
所以你可以使用Boost提供的后插件.
基本上,上面的代码所做的是定义一个可以写入的输出流.它被设置为所有写入它的内容将首先被解压缩gzip
,然后附加到back_inserter
back_inserters所做的内容,插入到decompressed
缓冲区的后面.
此外,如您所见,缓冲区被包装std::vector
.如果这对您有用,请告诉我.