【问题标题】:How to unzip a zip file already loaded in memory in C?如何解压缩已经在 C 内存中加载的 zip 文件?
【发布时间】:2012-06-02 15:30:42
【问题描述】:

我正在编写一个服务器,它从客户端接收一个 zip 文件,然后解压缩该文件。 当我收到 zip 文件时,我将其存储到内存中。

我找到并尝试了一些库来解压 zip 文件,例如 zlib 和 minizip,但它们都解压文件存在于磁盘上,而不是从内存中。

我不想暂时把文件存盘解压,效率不高。

如何从内存中解压文件? 我在 Windows 上编写 C 和 C++。

【问题讨论】:

标签: c++ c zip unzip


【解决方案1】:

看看libarchive 支持zip格式。

在内存中提取档案的例子:

struct archive *a = archive_read_new();
archive_read_support_compression_gzip(a);
archive_read_support_format_tar(a);
r = archive_read_open_memory(a, buff, sizeof(buff));

【讨论】:

    【解决方案2】:

    zlib 支持内存中的 inflate() 和 deflate() 函数。你可以从here阅读如何做

    【讨论】:

    • @Celebi:不支持 .zip 格式是什么意思?它是为处理 zip 格式而创建的。如果它不起作用,请检查标题。可能即使扩展名是 .zip,实际使用的压缩算法是 lzma 或其他。
    • @LeleDumbo zlib 的常见问题解答说它不处理 .zip 档案。 “请参阅 zlib 发行版中的目录 contrib/minizip”。但 minizip 从文件中处理 .zip 档案,而不是从内存中。
    • @LeleDumbo: zlib 支持inflate/deflate 压缩算法,用于.zip 文件。但它对 .zip 文件本身没有任何作用,需要将各种不同的压缩文件从 .zip 文件中提取出来,并分别通过 zlib 运行每个文件。如果有帮助,请考虑与媒体文件进行类比:您有编码,但也有容器格式。 .zip 文件(又名 PKZIP)是一种容器格式。
    • @SteveJessop,zlib 只是一个压缩库。为了提取 .zip 文件,我们需要编写额外的代码。你能帮我们举一个简单/示例的例子吗?我的项目也需要一个类似的例子。我需要读取 zip 文件并读取/提取内存中特定文件的内容。
    • @programmer:Raymond 对这个问题的回答包括一个指向 BSD 许可程序的链接来执行此操作。查看处理 PKZIP 格式的示例代码。如果太复杂,那么“minizip”可能更简单,搜索一下。
    【解决方案3】:

    libzip(基于 zlib)具有从内存打开存档的功能。示例代码是on github

    src = zip_source_buffer_create(data, size, 1, &error)
    za = zip_open_from_source(src, 0, &error)
    

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 1970-01-01
      • 2011-11-15
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多