C++ 使用zlib1.2.7解压gzip数据,如何获取文件';压缩包中的名称

C++ 使用zlib1.2.7解压gzip数据,如何获取文件';压缩包中的名称,c++,c,gzip,zlib,C++,C,Gzip,Zlib,使用zlib版本1.2.7解压gzip数据,但我不知道如何在压缩包中获取文件名,或者获取您正在提取的文件名。我找到的方法看起来像是将所有数据读取到缓冲区,然后返回 像这样: int gzdecompress(Byte *zdata, uLong nzdata, Byte *data, uLong *ndata) { int err = 0; z_stream d_stream = {0}; /* decompression stream */ static char du

使用zlib版本1.2.7解压gzip数据,但我不知道如何在压缩包中获取文件名,或者获取您正在提取的文件名。我找到的方法看起来像是将所有数据读取到缓冲区,然后返回

像这样:

int gzdecompress(Byte *zdata, uLong nzdata, Byte *data, uLong *ndata)
{
    int err = 0;
    z_stream d_stream = {0}; /* decompression stream */
    static char dummy_head[2] = {
        0x8 + 0x7 * 0x10,
        (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
    };
    d_stream.zalloc = NULL;
    d_stream.zfree = NULL;
    d_stream.opaque = NULL;
    d_stream.next_in  = zdata;
    d_stream.avail_in = 0;
    d_stream.next_out = data;
    //only set value "MAX_WBITS + 16" could be Uncompress file that have header or trailer text
    if(inflateInit2(&d_stream, MAX_WBITS + 16) != Z_OK) return -1;
    while(d_stream.total_out < *ndata && d_stream.total_in < nzdata) {
        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
        if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
        if(err != Z_OK) {
            if(err == Z_DATA_ERROR) {
                d_stream.next_in = (Bytef*) dummy_head;
                d_stream.avail_in = sizeof(dummy_head);
                if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK) {
                    return -1;
                }
            } else return -1;
        }
    }
    if(inflateEnd(&d_stream) != Z_OK) return -1;
    *ndata = d_stream.total_out;
    return 0;
}
int gz解压缩(字节*zdata,uLong nzdata,字节*data,uLong*nda)
{
int err=0;
z_-stream d_-stream={0};/*解压流*/
静态字符虚拟头[2]={
0x8+0x7*0x10,
((0x8+0x7*0x10)*0x100+30)/31*31)和0xFF,
};
d_stream.zalloc=NULL;
d_stream.zfree=NULL;
d_stream.不透明=空;
d_stream.next_in=zdata;
d_stream.avail_in=0;
d_stream.next_out=数据;
//只有设置值“MAX_WBITS+16”可以是具有头或尾文本的解压缩文件
如果(点火装置2(&d_流,最大值+16)!=Z_OK)返回-1;
而(d_stream.total_out<*数据和d_stream.total_in
使用示例:

// file you want to extract
filename = "D:\\gzfile";

// read file to buffer
ifstream infile(filename, ios::binary);
if(!infile)
{
    cerr<<"open error!"<<endl;
}
int begin = infile.tellg();
int end = begin;
int FileSize = 0;
infile.seekg(0,ios_base::end);
end = infile.tellg();
FileSize = end - begin;

char* buffer_bin = new char[FileSize];
char buffer_bin2 = new char[FileSize * 2];

infile.seekg(0,ios_base::beg);
for(int i=0;i<FileSize;i++)
    infile.read(&buffer_bin[i],sizeof(buffer_bin[i]));
infile.close( );

// uncompress 
uLong ts = (FileSize * 2);
gzdecompress((Byte*)buffer_bin, FileSize, (Byte*)buffer_bin2, &ts);
//要提取的文件
filename=“D:\\gzfile”;
//将文件读取到缓冲区
ifstream-infle(文件名,ios::binary);
如果(!infle)
{

cerr您的问题一点也不清楚,但是如果您试图获取存储在gzip头中的文件名,那么您应该阅读中的zlib文档。事实上,如果您计划以任何容量使用zlib,这将是一个好主意

在文档中,您会发现
inflate…()
函数将解压缩gzip数据,并且有一个
inflateGetHeader()
函数将返回gzip头内容


请注意,当
gzip
解压
.gz
文件时,它甚至不会查看标题中的名称,除非明确要求。gzip将解压为
.gz
文件的名称,例如
foo.gz
在解压时变为
foo
,即使gzip标题说名称是
bar
se
gzip-dN foo.gz
,然后它会称之为
bar
。现在还不清楚你为什么会关心gzip头中的名称。

例如:“A”是一个.gz文件。其中有两个.txt文件,名为“ua.txt”,“ub.txt”。我使用该方法解压缩gzip数据,希望将它们保存到“ua.txt”、“ub.txt”。我编写的函数,数组“buffer_bin2”只是数据,我需要知道我将创建哪个文件在文档中,但我不知道如何使用它来获取文件名。你能告诉我吗?不,你不能有两个文件。一个gzip文件只存储一个文件,而且只有一个文件。你是指
.tar.gz
文件吗?太尴尬了。呃…文件通过“GZipStream”存储在C语言中,我开发了C++代码来解压缩数据。所以只有一个文件……非常感谢。你能告诉我如何使用FrigGeTeAdER()函数吗?我仍然需要知道原始文件名。