C 使用zlib解压zip文件
我有一个archive.zip,其中包含两个加密的“.txt”文件。我想解压档案,以便检索这2个文件 以下是我迄今为止所做的工作: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 =
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中