12
votes

Décompressez un fichier zip à l'aide de zlib

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");


0 commentaires

3 Réponses :


9
votes

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.

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.


2 commentaires

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.



19
votes

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 CRC32 qui peut être utilisée pour générer et vérifier les valeurs de CRC dans les informations de wrapper zip.

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.


1 commentaires

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



3
votes

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.

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)

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.

repo avec des exemples ici: https://github.com/sebastiandev/zipper

Beta Pré-version: https://github.com/sebastiandev/zipper/relases/

code ressemble à quelque chose comme: xxx


0 commentaires