C 使用zlib解压zip文件

C 使用zlib解压zip文件,c,zlib,unzip,compression,C,Zlib,Unzip,Compression,我有一个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 =

我有一个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");

我总是得到“解压数据错误”,我不知道为什么。然后我想知道如何在数据未压缩的情况下检索这两个文件。

Zlib不是用于处理.zip文件的库。它支持解压缩zlib和gzip流,这两种流都在单个数据流的级别上工作,而不是像.zip这样的“归档”格式


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

zip是一种文件格式,它围绕压缩数据流包装头和尾信息,以表示一组文件和目录。压缩的数据流几乎总是压缩的,事实上zlib可以生成和解码压缩的数据流。zlib还提供了
crc32
函数,可用于生成和检查zip包装信息中的crc值


zlib本身没有做的是解码和解构zip结构。您可以使用编写自己的代码来实现这一点(这不是很难做到),也可以使用中的minizip例程,它提供了打开、访问和关闭zip文件的功能。

如前所述,zlib只处理压缩,不存档。当您想要压缩或解压时,您正在做的是从一个恰好是zip格式的归档文件中提取文件(还有其他格式,如rar、7zip等)

如果你想创建zip或解压文件,你必须处理zip格式,minizip是一个很好的库,很强大,已经存在很长时间了

这里有一个minizip的contrib,并举例说明如何使用它。没有那么难,您可以查看minizip.c和miniunz.c以了解如何使用它的代码。(Minizip使用zlib进行压缩)

最后我还构建了一个库,它包装了minizip,并为它添加了一系列不错的功能,使它更易于使用,更面向对象。让你做的事情,如压缩整个文件夹,流,向量等,以及做一切完全在内存中

回购协议举例如下:

测试版预发布:

代码看起来像:

Zipper zipper("ziptest.zip");
zipper.add("somefile.txt");
zipper.add("myFolder");
zipper.close();

哦,真的,我确信zlib会处理的.zip。。无论如何,谢谢你提供的信息!:)zlib实际上可以帮助处理zip文件,源代码发行版附带了处理zip文件的代码。看看我的答案。谢谢。我添加了contrib/minizip头并能够从zip读取文件(在已经使用zlib的应用程序中)。我只需要编写一些简单的函数,将对接口的调用封装在unzip.h中