C++解压缩一个gzip字节数组

6
这是完整的情况说明:我正在为从tiled读取的.tmx文件开发地图阅读器。大多数时候,瓷砖被保存在一个base64字符串中,其中包含由gzip压缩的字节数组。现在我可以读取压缩字节数组,但我不知道如何解压缩它。我阅读了一些关于zlib和boost的文档,但都是关于文件流且非常复杂的...
我对数据压缩领域非常陌生,所以如果有人知道某种解决方案或一些有用的文档,我会非常感激。
1个回答

9
#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>

int main() 
{
    using namespace std;

    ifstream file("hello.gz", ios_base::in | ios_base::binary);
    filtering_streambuf<input> in;
    in.push(gzip_decompressor());
    in.push(file);
    boost::iostreams::copy(in, cout);
}

我不确定为什么看上面的示例会觉得很难或复杂,这个示例是从http://www.boost.org/doc/libs/1_36_0/libs/iostreams/doc/classes/gzip.html上摘录的。解压非常简单。在解压之前,请确保您已解码base64。(如何在C中进行base64编码(解码)?应该会对您有所帮助)

1
接收来自其他架构的流时,请记得字节顺序。 - sehe
问题在于我不理解 filtering_streambuf 的工作原理,而我需要解压缩 char* 而不是文件...(我知道可以将 char* 放入文件中并稍后读取结果,但我想要更简单的方法) 关于字节顺序,tiled 是小端序的,这已经给我带来了一些麻烦,但现在没事了...感谢您的关注 :) - bardes
你可以将char*放入流中,使用stringstream即可实现。具体请参考http://www.cplusplus.com/reference/iostream/stringstream/。 - David Titarenco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接