我创建了一个简单的函数,它接受一个gzip压缩文件,并在某处提取。出于测试目的,我使用的文本文件已经通过通用实用程序 gzip 进行了压缩。 但由于某种原因,Uncompress()会返回错误Z_DATA_ERROR。
我走进调试器直到该函数,它肯定会获得正确的数据(整个文件内容,它只有37个字节),所以它似乎是两个中的一个:可怕的zlib-bug是现在偷你的时间,或者我错过了一些重要的事情,然后我真的很抱歉。
#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 %i\n", 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 encountered\n");
}
答案 0 :(得分:4)
您应该使用inflate()
,而不是uncompress()
。在inflateInit2()
中,您可以指定gzip格式(或自动检测zlib或gzip格式)。请参阅zlib.h中的文档。
您可以在zlib中获取uncompress()
的源代码并进行简单更改,以使用inflateInit2()
代替inflateInit()
来创建您自己的gzipuncompress()
,或者您自己的#{1}} 39;我喜欢称之为。