dégonfler et à gonfler (zlib.h) dans le C
Je suis en train de mettre en œuvre la zlib.h dégonfler et à gonfler les fonctions de compresser et de décompresser un char array (pas un fichier).
Je voudrais savoir si la syntaxe suivante est-elle correcte ? Ai-je raté quelque chose ou quelque chose de défini 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);
Demandez-vous car il n'a pas de travail? Êtes-vous d'obtenir une sorte de message d'erreur?
Il compile sans mise en garde, mais je veux savoir si les fonctions et les définitions que j'ai choisi de rendre le sens ou si je dois utiliser les autres.
L'a obtenu. Merci pour clarifier votre question.
Il compile sans mise en garde, mais je veux savoir si les fonctions et les définitions que j'ai choisi de rendre le sens ou si je dois utiliser les autres.
L'a obtenu. Merci pour clarifier votre question.
OriginalL'auteur Jane Watson | 2011-09-24
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas le printf de la dégonflé sortie comme celle-ci. Ce n'est pas une valeur null. Vous ne pouvez pas strlen il soit.
Depuis votre entrée est une chaîne si, vous probablement ne voulez seulement de transmettre le contenu de la chaîne, y compris le terminateur null. Donc, mettre avail_in à strlen(a) + 1.
Vous avez besoin d'examiner la next_out et avail_out champs après l'appel de dégonfler pour voir la quantité de données écrites dans la mémoire tampon de sortie.
Voir la documentation ici en vertu de la dégonfler appel.
Voici ton code modifié. Remarque si vous êtes à la compression de quelque chose qui n'est pas une chaîne, vous devez changer cela et aussi avec des chaînes, vous pouvez compresser sans la terminaison zéro et l'ajouter après la décompression.
OriginalL'auteur Guy Sirton
zlib dispose déjà d'un simple gonflage/dégonflage de la fonction que vous pouvez utiliser.
En cas de doute, consultez le zlib manuel.
Mon code est merdique, désolé =/
compress()
etuncompress()
sont de la forme la plus simple que vous pouvez obtenir, et vous le présenter plus que convenablement.Le problème avec cette utilité de la méthode est que vous devez en quelque sorte de savoir la taille de la ucompressed contenu... :/
Dans ce cas, vous pouvez utiliser sizeof() sur la non compressé de contenu. C'est une base de l'utilisation de la compresse() et décompresser() sont des méthodes qui est un bon début mais il y a plus de techniques efficaces.
OriginalL'auteur Yehia Hafez
La zpipe exemple (http://zlib.net/zpipe.c) couvre assez bien, il suffit de supprimer le fichier ops(f préfixé fonction), et vous le remplacez
in
etout
avec vos tampons de mémoire, mais il peut être suffisant de remplacerin
ou de garder les tampons, comme-est selon vous l'utilisation. Il suffit de noter que vous aurez besoin pour faire de votre hors tampon redimensionnables pour tenir compte de la décompression de l'arbitraire des données de taille, si vous prévoyez avoir inconnue morceaux de tailleOriginalL'auteur Necrolis