使用zlib解压缩zip文件

use*_*204 7 c compression zlib unzip

我有一个archive.zip,其中包含两个加密的".txt"文件.我想解压缩存档以检索这2个文件.

这是我到目前为止所做的:

FILE *FileIn = fopen("./archive.zip", "rb");
if (FileIn)
    printf("file opened\n");
else
    printf("unable to open file\n");

fseek(FileIn, 0, SEEK_END);
unsigned long FileInSize = ftell(FileIn);
printf("size of input compressed file : %u\n", FileInSize);

void *CompDataBuff = malloc(FileInSize);
void *UnCompDataBuff = NULL;

int fd = open ("archive.zip", O_RDONLY);
CompDataBuff = mmap(NULL, FileInSize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
printf("buffer read : %s\n", (char *)CompDataBuff);

uLongf UnCompSize = (FileInSize * 11/10 + 12);
UnCompDataBuff = malloc(UnCompSize);

int ret_uncp ;

ret_uncp = uncompress((Bytef*)UnCompDataBuff, &UnCompSize, (const Bytef*)CompDataBuff,FileInSize);
printf("size of uncompressed data : %u\n", UnCompSize);

if (ret_uncp == Z_OK){
    printf("uncompression ok\n");
    printf("uncompressed data : %s\n",(char *)UnCompDataBuff);
    }
if (ret_uncp == Z_MEM_ERROR)
    printf("uncompression memory error\n");
if (ret_uncp == Z_BUF_ERROR)
    printf("uncompression buffer error\n");
if (ret_uncp == Z_DATA_ERROR)
    printf("uncompression data error\n");
Run Code Online (Sandbox Code Playgroud)

我总是得到"解压缩数据错误",我不知道为什么.然后我想知道如何使用未压缩的数据检索2个文件.

Mar*_*ler 17

zip是一种文件格式,它包含压缩数据流周围的标题和尾部信息,以表示一组文件和目录.的压缩数据流几乎总是放气的数据流,其可以实际上被生成并通过ZLIB解码.zlib还提供了crc32可用于生成和检查zip包装器信息中的crc值的函数.

zlib本身没有做的是解码和解构zip结构.你可以编写自己的代码来使用规范(不是很难),或者你可以使用zlib发行版contrib/minizip目录中的minizip例程,它提供了打开,访问和关闭zip的功能.文件.


Kie*_*ron 7

Zlib不是用于处理.zip文件的库.它支持解压缩zlib和gzip流,它们都在单个数据流的层次上工作,而不是像.zip这样的"归档"格式.

您需要一个不同的库(例如,libzip ;还有许多其他库)来打开和操作.zip档案.

  • 哦,libzip使用zlib. (3认同)

Seb*_*ian 5

As mentioned, zlib only handles compression, it doesn't archive. When you want to zip or unzip what you are doing is extracting files from an archive which happens to be in a zip format (there are other formats like rar, 7zip and so on)

If you want to create zips or unzip files you have to handle the zip format and minizip is a nice library, robust and has been there for quite a long time.

There is a contrib for minizip https://github.com/nmoinvaz/minizip with examples on how to use it. Is not that hard, and you can check the minizip.c and miniunz.c for code on how to use it. (Minizip uses zlib for the compression)

Also i ended up building a library that wraps minizip and adds a bunch of nice features to it and makes it easier to use and more object oriented. Lets you do things like zip entire folders, streams, vectors, etc. As well as doing everything entirely in memory.

Repo with examples here: https://github.com/sebastiandev/zipper

Beta pre-release: https://github.com/sebastiandev/zipper/releases/

Code looks something like:

Zipper zipper("ziptest.zip");
zipper.add("somefile.txt");
zipper.add("myFolder");
zipper.close();
Run Code Online (Sandbox Code Playgroud)