/ / Uncompress () von 'zlib' gibt Z_DATA_ERROR - c ++, gzip, zlib zurück

Uncompress () von 'zlib' gibt Z_DATA_ERROR - c ++, gzip, zlib zurück

Ich machte eine einfache Funktion, die eine gezippte Datei nimmt und irgendwo extrahiert. Zu Testzwecken verwende ich eine Textdatei, die über ein generisches Dienstprogramm gezippt wurde gzip. Aber aus irgendeinem Grund Dekomprimieren () gibt einen Fehler zurück Z_DATA_ERROR.

Ich bin in einem Debugger bis zur Funktion gelaufen, und esbekommt sicherlich die richtigen Daten (ein ganzer Dateiinhalt, es sind nur 37 Bytes), also scheint es einer von zweien zu sein: Der fürchterliche zlib-Bug stiehlt gerade deine Zeit, oder ich vermisse etwas Wichtiges und dann wirklich Es tut uns leid.

#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");
}

Antworten:

4 für die Antwort № 1

Du solltest benutzen inflate()nicht uncompress(). Im inflateInit2()können Sie das gzip-Format angeben (oder die automatische Erkennung des zlib- oder gzip-Formats). Siehe die Dokumentation in zlib.h.

Sie können den Quellcode für verwenden uncompress() in zlib und machen Sie eine einfache Änderung zu verwenden inflateInit2() Anstatt von inflateInit() um dein eigenes zu erstellen gzipuncompress()oder wie auch immer du es nennen möchtest.