dégonfler et gonfler (zlib.h) en C

J’essaie d’implémenter les fonctions zlib.h deflate et inflate pour compresser et décompresser un tableau de caractères (pas un fichier).

Je voudrais savoir si la syntaxe suivante est correcte? Est-ce que je manque quelque chose ou défini quelque chose de manière incorrecte?

char a[50] = "Hello World!"; char b[50]; char c[50]; // deflate // zlib struct z_stream defstream; defstream.zalloc = Z_NULL; defstream.zfree = Z_NULL; defstream.opaque = Z_NULL; defstream.avail_in = (uInt)sizeof(a); // size of input defstream.next_in = (Bytef *)a; // input char array defstream.avail_out = (uInt)sizeof(b); // size of output defstream.next_out = (Bytef *)b; // output char array deflateInit(&defstream, Z_DEFAULT_COMPRESSION); deflate(&defstream, Z_FINISH); deflateEnd(&defstream); printf("Deflate:\n%lu\n%s\n", strlen(b), b); // inflate // zlib struct z_stream infstream; infstream.zalloc = Z_NULL; infstream.zfree = Z_NULL; infstream.opaque = Z_NULL; infstream.avail_in = (uInt)sizeof(b); // size of input infstream.next_in = (Bytef *)b; // input char array infstream.avail_out = (uInt)sizeof(c); // size of output infstream.next_out = (Bytef *)c; // output char array inflateInit(&infstream); inflate(&infstream, Z_NO_FLUSH); inflateEnd(&infstream); printf("Inflate:\n%lu\n%s\n", strlen(c), c); 

Vous ne pouvez pas imprimer la sortie déflatée comme ceci. Ce n’est pas nul terminé. Vous ne pouvez pas le strlen non plus.

Étant donné que votre entrée est une chaîne, vous ne voudrez probablement transmettre que le contenu de la chaîne, y compris le terminateur null. Réglez donc avail_in sur strlen (a) + 1.

Vous devez examiner les champs next_out et avail_out après avoir appelé deflate pour voir combien de données ont été écrites dans le tampon de sortie.

Voir la documentation ici sous l’appel deflate.

Voici votre code modifié. Notez que si vous compressez quelque chose qui n’est pas une chaîne, vous devrez le changer. Vous pouvez également compresser les chaînes sans le zéro final et les rappend après la décompression.

 char a[50] = "Hello World!"; char b[50]; char c[50]; // deflate // zlib struct z_stream defstream; defstream.zalloc = Z_NULL; defstream.zfree = Z_NULL; defstream.opaque = Z_NULL; defstream.avail_in = (uInt)strlen(a)+1; // size of input, ssortingng + terminator defstream.next_in = (Bytef *)a; // input char array defstream.avail_out = (uInt)sizeof(b); // size of output defstream.next_out = (Bytef *)b; // output char array deflateInit(&defstream, Z_DEFAULT_COMPRESSION); deflate(&defstream, Z_FINISH); deflateEnd(&defstream); // This is one way of getting the size of the output printf("Deflated size is: %lu\n", (char*)defstream.next_out - b); // inflate // zlib struct z_stream infstream; infstream.zalloc = Z_NULL; infstream.zfree = Z_NULL; infstream.opaque = Z_NULL; infstream.avail_in = (uInt)((char*)defstream.next_out - b); // size of input infstream.next_in = (Bytef *)b; // input char array infstream.avail_out = (uInt)sizeof(c); // size of output infstream.next_out = (Bytef *)c; // output char array inflateInit(&infstream); inflate(&infstream, Z_NO_FLUSH); inflateEnd(&infstream); printf("Inflate:\n%lu\n%s\n", strlen(c), c); 

zlib a déjà une fonction simple gonflage / dégonflage que vous pouvez utiliser.

 char a[50] = "Hello, world!"; char b[50]; char c[50]; uLong ucompSize = strlen(a)+1; // "Hello, world!" + NULL delimiter. uLong compSize = compressBound(ucompSize); // Deflate compress((Bytef *)b, &compSize, (Bytef *)a, ucompSize); // Inflate uncompress((Bytef *)c, &ucompSize, (Bytef *)b, compSize); 

En cas de doute, consultez le manuel de zlib . Mon code est nul, désolé = /

L’exemple zpipe (http://zlib.net/zpipe.c) couvre à peu près cela, il suffit de supprimer le fichier ops (la fonction préfixée par f), et vous remplacez in et out par vos tampons en mémoire, bien qu’il assez pour ne remplacer que in ou conserver les tampons tels quels, en fonction de votre utilisation. Notez simplement que vous devrez redimensionner votre tampon de sortie pour prendre en compte la décompression de données de taille arbitraire, si vous prévoyez des morceaux de taille inconnue.