簡體   English   中英

使用 libarchive 將 gzip 文件解壓縮到內存

[英]Decompressing gzip file to memory using libarchive

我正在嘗試以編程方式將 gzip 文件解壓縮到內存中,並使用libarchive project模擬命令gzip -d file.gz 該文件實際上取自帶有以下標頭Accept-Encoding: gzip, deflate http 響應

在這里,我嘗試讀取文件。 我不希望它不起作用,因為 gzipped 文件沒有條目(它被壓縮為流)並且archive_read_next_header嘗試從存檔中讀取下一個文件。

是否有任何替代此功能的方法可以從壓縮文件中提取整個數據。

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 存檔文件是否有條目?

一種可能的替代方法是使用boost::iostreams庫,該庫帶有內置的 gzip 過濾器,並允許您完全按照您的要求進行操作——從內存中的 gzip 文件流式解壓。 這是對gzip filter的引用,以及來自相同的片段:

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有兩種方法可以做到這一點:

  1. 使用內置的 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;
}
  1. 本機inflate API: Coliru Link 上面和這里的手冊鏈接中有更多關於這方面的信息 我的代碼幾乎完全是提供的鏈接的副本,而且很長,所以我不會重新發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM