7. Zlib sans les fichiers

Si l'on veut juste compresser une zone de mémoire, il existe trois instructions pour cela :

int compress (Bytef *dest, uLongf *longueur_dest, const Bytef *source, uLong longueur_source);
int compress2 (Bytef *dest, uLongf *longueur_dest, const Bytef *source, uLong longueur_source, int niveau);

Ces deux instructions compressent un espace mémoire qui se trouve à l'adresse pointée par source et de longueur source_dest. Le résultat se trouve à l'adresse pointée par dest de taille longueur_dest. Attention, l'expression suivante doit toujours être vérifiée :

longueur_dest >= (longueur_source + longueur_source * 10% + 12)

C'est-à-dire

longueur_dest >= (longueur_source * 11/10 + 12)

L'argument niveau est tout simplement le taux de compression, un int compris entre 0 et 9 inclus.

int uncompress (Bytef *dest, uLongf *longueur_dest, const Bytef *source, uLong longueur_source);

Cette instruction effectue le travail inverse des deux instructions précédentes. La source de taille longueur_source contient les données en mémoire à décompresser. Par contre, la dest qui va accueillir le résultat doit avoir une longueur longueur_dest suffisante pour la totalité de l'espace mémoire décompressé.

Les trois fonctions renvoient Z_OK si tout s'est bien passé, Z_MEM_ERROR si la mémoire était insuffisante, Z_BUF_ERROR si le buffer de sortie était trop petit, ou Z_DATA_ERROR si les données en entrée étaient corrompues.

création est mise à disposition sous un contrat Creative Commons