/ / Uncompress () de 'zlib' renvoie Z_DATA_ERROR - c ++, gzip, zlib

Uncompress () de 'zlib' retourne Z_DATA_ERROR - c ++, gzip, zlib

J'ai créé une fonction simple qui prend un fichier compressé et extrait quelque part. A des fins de test, j’utilise un fichier texte qui a été compressé avec un utilitaire générique gzip. Mais pour une raison quelconque, le Décompresser () renvoie une erreur Z_DATA_ERROR.

Je suis entré dans un débogueur jusqu'à la fonction, etobtient sûrement les bonnes données (tout le contenu d'un fichier, il ne s'agit que de 37 octets), il semble donc s'agir de l'une des deux: l'effrayant zlib-bug te prend du temps pour l'instant, ou je manque quelque chose d'important et puis je Pardon.

#include <zlib.h>
#include <cstdio>

int UngzipFile(FILE* Dest, FILE* Source){
#define IN_SIZE 256
#define OUT_SIZE 2048
bool EOFReached=false;
Bytef in[IN_SIZE];
Bytef out[OUT_SIZE];
while(!EOFReached){//for no eof
uLong In_ReadCnt = fread(in,1,IN_SIZE,Source);//read a bytes from a file to input buffer
if(In_ReadCnt!=IN_SIZE){
if(!feof(Source) ){
perror("ERR");
return 0;
}
else    EOFReached=true;
}
uLong OutReadCnt = OUT_SIZE;//upon exit "uncompress" this will have actual uncompressed size
int err = uncompress(out, &OutReadCnt, in, In_ReadCnt);//uncompress the bytes to output
if(err!=Z_OK){
printf("An error ocurred in GZIP, errcode is %in", err);
return 0;
}
if(fwrite(out,1,OutReadCnt,Dest)!=OUT_SIZE ){//write to a "Dest" file
perror("ERR");
return 0;
}
}
return 1;
}

int main(int argc, char** argv) {
FILE* In = fopen("/tmp/Kawabunga.gz", "r+b");
FILE* Out = fopen("/tmp/PureKawabunga", "w+b");
if(!In || !Out){
perror("");
return 1;
}
if(!UngzipFile(Out,In))printf("An error encounteredn");
}

Réponses:

4 pour la réponse № 1

Tu devrais utiliser inflate(), ne pas uncompress(). Dans inflateInit2(), vous pouvez spécifier le format gzip (ou la détection automatique du format zlib ou gzip). Voir la documentation dans zlib.h.

Vous pouvez prendre le code source pour uncompress() dans zlib et faire un changement simple à utiliser inflateInit2() au lieu de inflateInit() créer le vôtre gzipuncompress(), ou peu importe comment vous voulez l'appeler.