2012-09-23 4 views
0

Je travaille sur un projet dans lequel si quelque chose ne va pas sur mon disque, j'enverrai des morceaux de mémoire sur un autre disque après l'avoir compressé en utilisant ZLIB. Ce vidage, puis je prévois de télécharger et d'utiliser pour le débogage ultérieur. La compression et le téléchargement doivent être faits un morceau à la fois - disons 1024 K.compression ZLIB

La capture est que je dois avoir des morceaux de sortie de exactement 1024K avant de le télécharger sur l'autre disque (en plus de cela il y aura des en-têtes et bandes-annonces ainsi si cette taille de morceau est la taille des données compressées) comme alors je peux facilement les décompresser et l'utiliser. J'ai essayé de changer la fonction put_byte de telle sorte qu'une fois que le tampon de sortie est 1024K je peux l'envoyer à l'autre disque mais cela ne semble pas fonctionner.

J'ai pensé à vérifier Z_BUF_ERROR puis à l'envoyer et à redémarrer toute la procédure de compression, mais je ne serais pas sûr que toutes les entrées/sorties en attente aient été vidées. Y a-t-il une autre façon de procéder, c'est-à-dire de m'assurer que les paquets sont envoyés lorsque le tampon de sortie (taille des données compressées) a exactement 1024K octets.

+0

O/P? OP? IP? Se il vous plaît définir. –

+0

O/P ou OP => tampon de sortie stockant les données compressées IP ou I/P => tampon d'entrée stockant les données brutes. – Zshn

+3

Si vous voulez simplement décomposer la sortie de 'deflate()' en morceaux de 1K, alors fournissez 'deflate()' avec 1K de sortie, c'est-à-dire 'strm.avail.out = 1024;'. Fournissez une entrée à 'deflate()' jusqu'à 'strm.avail.out == 0' ou vous n'avez plus d'entrée. Ensuite, écrivez ce morceau. –

Répondre

0

Peut-être auriez-vous plus de chance d'utiliser une bibliothèque de façade de niveau supérieur telle que la bibliothèque ZLibComplete C++ http://github.com/rudi-cilibrasi/zlibcomplete. Il utilise std :: string et ne nécessite aucune allocation dynamique. Vous n'avez donc pas besoin de gérer vous-même les buffers. Mettez simplement std :: string et écrivez la chaîne std :: string retournée. Vous n'avez pas non plus besoin de vérifier les valeurs de retour. avez-vous besoin de faire une boucle conditionnellement. Il fonctionne simplement en termes de chaînes: mettez une chaîne, obtenez une chaîne aussi longtemps que vous le souhaitez pour la compression ou la décompression. Il existe des exemples de programmes courts que vous pouvez utiliser pour les deux formats de compression courants, GZip et ZLib.