C++ 解压缩';zlib';返回Z_数据错误

C++ 解压缩';zlib';返回Z_数据错误,c++,gzip,zlib,C++,Gzip,Zlib,我做了一个简单的函数,它接受一个gzip文件,并在某处提取。出于测试目的,我使用了一个文本文件,它是通过一个通用实用程序gzip压缩的。 但由于某种原因,返回一个错误 我在一个调试器中走到函数中,它肯定得到了正确的数据(一个完整的文件内容,只有37个字节),所以它似乎是两种情况之一:可怕的zlib错误正在占用您的时间,或者我错过了一些重要的东西,然后我真的很抱歉 #include <zlib.h> #include <cstdio> int UngzipFile(FIL

我做了一个简单的函数,它接受一个gzip文件,并在某处提取。出于测试目的,我使用了一个文本文件,它是通过一个通用实用程序gzip压缩的。 但由于某种原因,返回一个错误

我在一个调试器中走到函数中,它肯定得到了正确的数据(一个完整的文件内容,只有37个字节),所以它似乎是两种情况之一:可怕的zlib错误正在占用您的时间,或者我错过了一些重要的东西,然后我真的很抱歉

#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_数据错误)。”