提升 gzip 解压缩字节数组
boost gzip decompress byte array
我实现了文件的gzip/zlib解压缩,如他们在boost站点上的示例所示。
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);
}
这工作正常。我还从套接字读取数据,该套接字也从基于休息的 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*
表示。这应该很容易,而且可能是,但是在过去的几个小时里,我一直在浪费尝试不成功的尝试。
显然,您遇到了过滤流和流缓冲区。可以反向使用相同的方法将数据放入字符串中。
我手边没有自己的示例,所以认为这有点伪代码,但这应该是您正在寻找的:
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_inserter
,back_inserters插入到decompressed
缓冲区的背面。
此外,如您所见,缓冲区包装在 std::vector
中。让我知道这是否适合您。
相关文章:
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中将整数转换为其数字数组
- 如何将带有不定条目的行读取到数字数组中?
- 对于非常大的输入,缺少和重复 1..n 的数字数组.使用1..n系列特性的解决方案.溢出问题
- 有没有一种方法可以接受数字数组而不接受垃圾值的输入
- 从数字数组中删除重复
- 如何打印给定i和j的数字数组,使得i的所有元素的总和等于j
- 将数字与数字数组进行比较
- 将数字数组保存到Spesific文件中,然后稍后调用
- 从排序的数字数组中返回数字范围的最快方法是什么?
- 如何通过libpq c api插入字节的数组
- 无法让我的代码正确排序用户输入的数字数组(使用递归)
- i2c中的字节指针数组
- 以 C++ 为单位递增 16 字节字符数组
- new[] 一个包含构造函数的字节对象数组没有错,对吧?
- 创建未知长度的字节/字符数组
- 我如何将bitset转换为字节/uint8数组
- C++ <--> C# 修改字节编组数组
- 将m个字节的数组拆分为n个字节的块
- c++到c#:有3个元素的字节指针数组等于什么?