使用 libarchive 将 gzip 文件解压缩到内存
Decompressing gzip file to memory using libarchive
我正在尝试以编程方式将 gzip 文件解压缩到内存中,并使用 libarchive 项目模拟命令gzip -d file.gz
。该文件实际上是从 http 响应中获取的,标头如下Accept-Encoding: gzip, deflate
在这里,我尝试读取文件。我不希望不起作用,因为 gzip 文件没有条目(它被压缩为流),并且archive_read_next_header
尝试从 arcihve 中读取下一个文件。
是否有任何替代功能的替代方法,可以从压缩文件中提取整个数据。
archive_read_support_format_raw(archive);
archive_read_support_filter_all(archive);
archive_read_support_compression_all(archive)
archive_read_open_memory(archive, file_data, file_size);
struct archive_entry *entry;
la_ssize_t total, size;
char *buf;
int status = archive_read_next_header(archive, &entry);
也许有人可以发布解决此问题的最小代码示例?另外,是否有选项可以找出gzip存档文件是否有条目?
一种可能的替代方案是使用带有内置 gzip 过滤器boost::iostreams
库,并允许您想要的 - 从内存中的 gzip 文件流式解压缩。以下是对 gzip 过滤器的引用,以及来自该过滤器的代码片段:
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);
编辑:实际上这里有一个更好的片段 https://stackoverflow.com/a/16693807/3656081
有两种方法可以使用zlib
执行此操作:
- 使用内置的GzFile API:Coliru Link - 在此处阅读更多内容
int inf(FILE* fp) {
auto gzf = ::gzdopen(fileno(fp), "r");
assert(::gztell(gzf) == 0);
std::cout << "pos: " << ::gztell(gzf) << std::endl;
::gzseek(gzf, 18L, SEEK_SET);
char buf[768] = {0};
::gzread(gzf, buf, sizeof(buf)); // use a custom size as needed
std::cout << buf << std::endl; // Print file contents from 18th char onward
::gzclose(gzf);
return 0;
}
- 原生
inflate
API:Coliru Link。有关此内容的更多信息,请参阅上面和此处的手动链接。我的代码几乎完全是提供的链接的副本,而且很长,所以我不会重新发布。
相关文章:
- 使用C++进行运行长度解压缩
- C++ 如何将数组值解压缩为函数参数
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 在 Qt(C++) 中使用 QProcess 解压缩 - 提取目录问题
- 浏览压缩文件与游览解压缩它们
- 如何在C++向量中解压缩多个值
- 解压缩 C 样式数组以及C++中的参数包
- 如何在 cpp 中解压缩数字,如果它们是使用 struct.pack(fmt, v1, v2, ..) 打包在 pyth
- 如何使用 Poco::ZIP 压缩/解压缩 zip 文件
- 在编译时解压缩数组扩展数据块 (C++11/14)
- 使用 RtMidi 解压缩 Midi 时间码
- 将参数包解压缩到 std::initializer_list?
- 用C++压缩内存中的位图
- 解压缩可变模板参数
- 解压缩附加的压缩字符串
- 使用 libarchive 将 gzip 文件解压缩到内存
- C -我如何gzip解压缩块文件到内存缓冲区
- C++-Zip Utils从内存解压缩到内存
- LZ4解压缩未知大小的二进制内存块
- 压缩/解压缩内存中的数据