C++ 解压缩';zlib';返回Z_数据错误
我做了一个简单的函数,它接受一个gzip文件,并在某处提取。出于测试目的,我使用了一个文本文件,它是通过一个通用实用程序gzip压缩的。 但由于某种原因,返回一个错误 我在一个调试器中走到函数中,它肯定得到了正确的数据(一个完整的文件内容,只有37个字节),所以它似乎是两种情况之一:可怕的zlib错误正在占用您的时间,或者我错过了一些重要的东西,然后我真的很抱歉C++ 解压缩';zlib';返回Z_数据错误,c++,gzip,zlib,C++,Gzip,Zlib,我做了一个简单的函数,它接受一个gzip文件,并在某处提取。出于测试目的,我使用了一个文本文件,它是通过一个通用实用程序gzip压缩的。 但由于某种原因,返回一个错误 我在一个调试器中走到函数中,它肯定得到了正确的数据(一个完整的文件内容,只有37个字节),所以它似乎是两种情况之一:可怕的zlib错误正在占用您的时间,或者我错过了一些重要的东西,然后我真的很抱歉 #include <zlib.h> #include <cstdio> int UngzipFile(FIL
#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");
}
#包括
#包括
int UngzipFile(文件*Dest,文件*Source){
#定义大小为256
#定义尺寸为2048
bool-EOFReached=false;
Bytef英寸[英寸大小];
Bytef out[out_SIZE];
而(!EOFReached){//表示没有eof
uLong In_ReadCnt=fread(In,1,In_SIZE,Source);//从文件读取一个字节到输入缓冲区
if(In_ReadCnt!=In_大小){
如果(!feof(源)){
佩罗(“ERR”);
返回0;
}
else-EOFReached=true;
}
uLong OutReadCnt=OUT_SIZE;//退出“解压缩”后,将具有实际的未压缩大小
int err=uncompress(out,&OutReadCnt,in,in_ReadCnt);//解压缩要输出的字节
如果(错误!=Z_OK){
printf(“GZIP中出现错误,错误代码为%i\n”,err);
返回0;
}
如果(fwrite(out,1,OutReadCnt,Dest)!=out\u SIZE){//写入“Dest”文件
佩罗(“ERR”);
返回0;
}
}
返回1;
}
int main(int argc,字符**argv){
文件*In=fopen(“/tmp/Kawabunga.gz”,“r+b”);
文件*Out=fopen(“/tmp/PureKawabunga”,“w+b”);
如果(!In | |!Out){
佩罗尔(“”);
返回1;
}
如果(!UngzipFile(Out,In))printf(“遇到错误\n”);
}
您应该使用充气()
,而不是解压()
。在inflateInit2()
中,您可以指定gzip格式(或自动检测zlib或gzip格式)。请参阅zlib.h中的文档
您可以在zlib中获取
uncompress()
的源代码,并做一个简单的更改,使用inflateInit2()
而不是inflateInit2()
来创建您自己的gzip解压()
,或者您想称之为它的任何东西。uncompress()用于使用deflate算法压缩的原始数据,它不知道gzip格式。@不,我也只是想了想。现在我正在寻找一个标题规范,如果我找到了,我会在这里发布一个有效的解决方案。虽然我想知道:应该已经有一些东西在工作了……您可以在链接到的页面上使用gzopen()函数。或者使用充气()函数。gzip格式在RFC1952中有文档记录。实际上,gzip()允许读取文件,就像读取未压缩的文件一样@不,如果你把你的两条评论像答案一样贴出来,那就好了,这就是解决办法!否,uncompress()
用于zlib格式,而不是原始deflate。但是,是的,它不知道gzip格式。在使用充气()之前,我已经尝试过了,但是它太令人困惑了。起初有人写到,zlib和gzip格式是不同的。但它也表示,gzip也受支持,那么我应该指出应该使用哪种格式呢?函数和结构都与此无关。也许它能做某种自动识别?那么,我可以将哪一个最小的字符块扔给inflate()函数?这个人似乎不是人们写的,他们希望有人试图触摸图书馆:我说,用inflateInit2()
。从手册中可以看出:“对于可选的gzip解码,windowBits也可以大于15。向windowBits添加32以启用zlib和gzip解码,并自动检测报头,或者添加16以仅解码gzip格式(zlib格式将返回Z_数据错误)。”