J'ai une archive.zip qui contient deux fichiers ".txt" cryptés. Je voudrais décompresser l'archive afin de récupérer ces 2 fichiers.
Voici ce que j'ai fait jusqu'à présent: P>
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");
3 Réponses :
zlib n'est pas une bibliothèque pour la manipulation de fichiers .zip. Il prend en charge la décompression des flux de zlib et de gzip, qui fonctionnent tous deux sur le niveau d'un seul flux de données, plutôt qu'un format "archive" comme .zip. P>
Vous auriez besoin d'une bibliothèque différente (pour un exemple, libzip ; il y en a beaucoup d'autres) à ouvrir et manipuler des archives .zip. p>
Oh vraiment, j'étais sûr que Zlib traiterait .zip .. de toute façon merci pour des informations! :)
ZLIB peut en fait aider avec le traitement zip et la distribution source est livrée avec un code contribué à traiter les fichiers ZIP. Voir ma réponse.
Zip est un format de fichier qui enveloppe les informations en-tête et la remorque autour des flux de données compressés afin de représenter un ensemble de fichiers et de répertoires. Les flux de données compressés sont presque toujours déformer les flux de données , qui peuvent en réalité être générés et décodés par zlib . ZLIB fournit également la fonction Ce que Zlib ne fait pas en soi est décodé et déconstruire la structure zippée. Vous pouvez soit écrire votre propre code pour le faire en utilisant le Spécification (pas très difficile à faire), ou vous pouvez utiliser les routines Minizip dans le Annuaire Contrib / Minizip du Distribution ZLIB , qui fournit des fonctions à ouvrir, à accéder et à fermer zip Fichiers. P> CRC32 code> qui peut être utilisée pour générer et vérifier les valeurs de CRC dans les informations de wrapper zip. P>
Merci. J'ai ajouté les en-têtes de contributions / Minizip et j'ai pu lire des fichiers d'un zip (dans une application qui utilisait déjà ZLIB). Je devais juste écrire quelques fonctions simples pour envelopper les appels à l'interface à Unzip.h
Comme mentionné, Zlib ne gère que la compression, elle n'articule pas. Lorsque vous souhaitez zip ou décompressez ce que vous faites, il est extraire des fichiers d'une archive qui se trouve être dans un format zip (il existe d'autres formats comme RAR, 7ZIP, etc.)
Si vous souhaitez créer des zips ou des fichiers décompressés Vous devez gérer le format zip et Minizip est une belle bibliothèque, robuste et y a été très longue. P>
Il y a une contribution de Minizip https://github.com/nmoinvaz/minizip avec des exemples sur la façon de l'utiliser. N'est-ce pas si difficile, et vous pouvez vérifier le minizip.c et le miniunz.c pour le code sur la façon de l'utiliser. (Minizip utilise zlib pour la compression) em> p> J'ai également fini par construire une bibliothèque qui enveloppe Minizip et ajoute une bouquet de fonctionnalités de jolie et facilite l'utilisation et plus d'objet orienté. Vous permet de faire des choses comme des dossiers entiers, des flux de flux, des vecteurs, etc., ainsi que tout en mémoire en mémoire. P> repo avec des exemples ici: https://github.com/sebastiandev/zipper p> Beta Pré-version: https://github.com/sebastiandev/zipper/relases/ p> code ressemble à quelque chose comme: p>