当前位置:首页 » 文件管理 » zlib解压zip文件

zlib解压zip文件

发布时间: 2022-06-23 03:52:58

A. 怎么用zlib生成标准zip压缩文件和解压缩zip文件

你用的是什么压缩软件?7-Zip? rar是Winrar的私有格式,其它压缩软件通常只能打开和解压缩,而不能生成(否则必须得到Winrar的授权)。 其它你用7z格式就可以了,Winrar等都可以打开7z(7-Zip是开源软件)。你发给别人7z格式,他不论装什么压缩.

B. Qt怎么解压zip的压缩包

Qt调用zlib解压缩的方法

/**
*返回值:将解压出来的文件的绝对路径保存在QStringList中
*
*参数:FileName是要解压的zip文件的绝对路径,QStringList其实也就是QList<QString>list类型用来保存解压后各文件的路径
*
*功能:解压指定的zip文件并将解压出来的文件的绝对路径保存在list中
**/voidWidgetSmallClass::slot_UncompressedFile(QStringFileName,QStringList&ListPic)
{
/**新建一个文件夹,用来保存解压后的文件*/
QStringUnpressPath=FileName.remove(".zip");
QDirdir;
dir.mkpath(UnpressPath);

unz_file_info64FileInfo;
/**打开zip文件,这里记得一定要加上".zip",因为在上面的时候已经将".zip"移出去了。*/
unzFilezFile=unzOpen64((FileName+".zip").toStdString().c_str());
unz_global_info64gi;
/**获取文件数量*/
if(unzGetGlobalInfo64(zFile,&gi)==UNZ_OK)
{
intresult;
for(inti=0;i<gi.number_entry;++i)
{
charfile[256]={0};
charext[256]={0};
charcom[1024]={0};
if(unzGetCurrentFileInfo64(zFile,&FileInfo,file,sizeof(file),ext,256,com,1024)!=UNZ_OK)
{
;
}
if(!(FileInfo.external_fa&FILE_ATTRIBUTE_DIRECTORY))//文件,否则为目录
{
result=unzOpenCurrentFile(zFile);//无密码
result=unzOpenCurrentFilePassword(zFile,"szPassword");//有密码
}
chardata[1024]={0};
intsize;
/**将路径写到list中*/
QStringpath=UnpressPath+QString("/")+file;
ListPic<<path;
QFileFile(path);
File.open(QFile::WriteOnly);
/**打开新文件并将数据写进去*/
while(true)
{
size=unzReadCurrentFile(zFile,data,sizeof(data));
if(size<=0){break;}
File.write(data,size);
}
File.close();
unzCloseCurrentFile(zFile);
if(i<gi.number_entry-1&&unzGoToNextFile(zFile)!=UNZ_OK){return;}
}
unzClose(zFile);
}
else{return;}
}

C. 在Linux下,用zlib写解压文件的C程序,需要事先知道文件压缩前的大小么怎么得到

.gz文件的最后4字节就是压缩前的原长度(ISIZE),并且倒数第二个4字节是压缩前原buffer的CRC32冗余校验值。参见标准文档 rfc1952 (https://tools.ietf.org/html/rfc1952).

D. C++语言怎么用zlib库来解压.ISO或.zip文件

下面是使用zlib库的压缩和解压缩演示代码:

#include <stdlib.h>
#include <stdio.h>
#include <zlib.h>
int main(int argc, char* argv[])
{
FILE* file;
uLong flen;
unsigned char* fbuf = NULL;
uLong clen;
unsigned char* cbuf = NULL;
/* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */
if(argc < 3)
{
printf("Usage: zcdemo srcfile dstfile\n");
return -1;
}
if((file = fopen(argv[1], "rb")) == NULL)
{
printf("Can\'t open %s!\n", argv[1]);
return -1;
}
/* 装载源文件数据到缓冲区 */
fseek(file, 0L, SEEK_END);    /* 跳到文件末尾 */
flen = ftell(file);        /* 获取文件长度 */
fseek(file, 0L, SEEK_SET);
if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL)
{
printf("No enough memory!\n");
fclose(file);
return -1;
}
fread(fbuf, sizeof(unsigned char), flen, file);
/* 压缩数据 */
clen = compressBound(flen);
if((cbuf = (unsigned char*)malloc(sizeof(unsigned char) * clen)) == NULL)
{
printf("No enough memory!\n");
fclose(file);
return -1;
}
if(compress(cbuf, &clen, fbuf, flen) != Z_OK)
{
printf("Compress %s failed!\n", argv[1]);
return -1;
}
fclose(file);
if((file = fopen(argv[2], "wb")) == NULL)
{
printf("Can\'t create %s!\n", argv[2]);
return -1;
}
/* 保存压缩后的数据到目标文件 */
fwrite(&flen, sizeof(uLong), 1, file);    /* 写入源文件长度 */
fwrite(&clen, sizeof(uLong), 1, file);    /* 写入目标数据长度 */
fwrite(cbuf, sizeof(unsigned char), clen, file);
fclose(file);
free(fbuf);
free(cbuf);
return 0;
}

E. 如何解压用zlib压缩的文件

360软件宝库里面下载个快压就好了

F. 用C语言简单演示如何借助zlib库实现文件的压缩和解压缩

问题的根源在于这些网友对于字符串和字节流的概念非常的模糊,对文本文件和二进制文件的区别常常模棱两可,其实字节流可以表示所有的数据,二进制文件才是任何文件的本质。字节流是一个字节接一个字节,并没有结束符号,所以需要给它一个长度信息。二进制文件是一个字节接一个字节,并没有换行符之类的。文件压缩的时候,可以通过源文件的长度自动计算缓冲区的长度,压缩后写入目标文件之前,需先保留源文件和目标数据的长度作为解压缩的依据,参考如下代码:#include #include #include int main(int argc, char* argv[]) { FILE* file; uLong flen; unsigned char* fbuf = NULL; uLong clen; unsigned char* cbuf = NULL; /* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */ if(argc < 3) { printf("Usage: zcdemo srcfile dstfile\n"); return -1; } if((file = fopen(argv[1], "rb")) == NULL) { printf("Can\'t open %s!\n", argv[1]); return -1; } /* 装载源文件数据到缓冲区 */ fseek(file, 0L, SEEK_END); /* 跳到文件末尾 */ flen = ftell(file); /* 获取文件长度 */ fseek(file, 0L, SEEK_SET); if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } fread(fbuf, sizeof(unsigned char), flen, file); /* 压缩数据 */ clen = compressBound(flen); if((cbuf = (unsigned char*)malloc(sizeof(unsigned char) * clen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } if(compress(cbuf, &clen, fbuf, flen) != Z_OK) { printf("Compress %s failed!\n", argv[1]); return -1; } fclose(file); if((file = fopen(argv[2], "wb")) == NULL) { printf("Can\'t create %s!\n", argv[2]); return -1; } /* 保存压缩后的数据到目标文件 */ fwrite(&flen, sizeof(uLong), 1, file); /* 写入源文件长度 */ fwrite(&clen, sizeof(uLong), 1, file); /* 写入目标数据长度 */ fwrite(cbuf, sizeof(unsigned char), clen, file); fclose(file); free(fbuf); free(cbuf); return 0; }文件解压缩的时候,可以通过保留信息得到缓冲区和数据流的大小,这样解压缩后直接保存即可,参考如下代码:#include #include #include int main(int argc, char* argv[]) { FILE* file; uLong flen; unsigned char* fbuf = NULL; uLong ulen; unsigned char* ubuf = NULL; /* 通过命令行参数将srcfile文件的数据解压缩后存放到dstfile文件中 */ if(argc < 3) { printf("Usage: zudemo srcfile dstfile\n"); return -1; } if((file = fopen(argv[1], "rb")) == NULL) { printf("Can\'t open %s!\n", argv[1]); return -1; } /* 装载源文件数据到缓冲区 */ fread(&ulen, sizeof(uLong), 1, file); /* 获取缓冲区大小 */ fread(&flen, sizeof(uLong), 1, file); /* 获取数据流大小 */ if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } fread(fbuf, sizeof(unsigned char), flen, file); /* 解压缩数据 */ if((ubuf = (unsigned char*)malloc(sizeof(unsigned char) * ulen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } if(uncompress(ubuf, &ulen, fbuf, flen) != Z_OK) { printf("Uncompress %s failed!\n", argv[1]); return -1; } fclose(file); if((file = fopen(argv[2], "wb")) == NULL) { printf("Can\'t create %s!\n", argv[2]); return -1; } /* 保存解压缩后的数据到目标文件 */ fwrite(ubuf, sizeof(unsigned char), ulen, file); fclose(file); free(fbuf); free(ubuf); return 0; }

G. 如何使用Zlib解压内存块中的文件

1 准备工作。 下载zlib.dll。以及相关头文件。将dll文件及头文件加入工程。 2 压缩: 调用函数compress. 形式为 int compress(Byte * dest, uLong* destLen, const Byte *source, ULONG sourceLen); 功能是将source指向的空间,长度为sourceLen的数据进行压缩,压缩数据储存在dest中,长度由参数destLen返回。 如果压缩出错,返回对应错误号,否则返回0. 3解压缩: 调用函数uncompress. 形式为 int uncompress(Byte * dest, uLong* destLen, const Byte *source, ULONG sourceLen); 功能是将source指向的空间,长度为sourceLen的数据进行解压缩,解压缩后的数据储存在dest中,长度由参数destLen返回。 如果解压缩出错,返回对应错误号,否则返回0.

H. 有没有会使用zlib库解压zip包的

bool unzip(const char *DestName, const char *SrcName) { //解压缩文件时的源buffer char* uSorceBuffer = new char[1024*1024*2]; memset(uSorceBuffer,0,sizeof(char)*1024*1024*2); FILE* fp3; //打开欲解压文件的文件指针 FILE* fp4; //创...

I. 如何发挥zlib压缩解压的最大效

首先说明,这里不是横向比较zlib与别的引擎(rar,leo,powerarc...),是探索如何发挥zlib压缩/解压的最大效率。
先看看如下代码在效率上的差异:
var MS:TMemoryStream;(1):begin MS:=TMemoryStream.Create; MS.Size:=$400000;//4M------------------------------------------------(2):var i:integer;begin MS:=TMemoryStream.Create; for i:=1 to 1024 do MS.Size:=MS.Size+4096;

你会发现,方法(1)只要1个毫秒,方法(2)却要20秒。
因此,如果把解压缩程序写成下面这样,会非常没有效率:
procere ZlibDeCompress(instream,outStream:TStream);var ACS:TDeCompressionStream; buf:array[1..4096] of byte; numread:integer;begin inStream.Position:=0; ACS:=TDeCompressionStream.Create(inStream); try repeat numRead:=ACS.Read(buf,sizeof(buf)); if numread>0 then outStream.Write(buf,numRead); until (numRead=0); finally ACS.Free; end;end;

如果我们知道原始资料的大小,一次确定outStream.Size,效率就可以提高几十倍。方法很简单,我们可以在压缩时,把原始资料的Size写在压缩Stream的头部,如,写一个LongWord的大小,解压时就可以先读出Size,因此,最有效率的解压程序为:
procere ZlibDecompressStream2(Source,Dest:TMemoryStream);var zstream: TZStreamRec; SourceLen,DestLen:LongWord;begin FillChar(zstream,SizeOf(TZStreamRec),0); SourceLen:=Source.Size; Source.Position:=0; Source.Read(DestLen,SizeOf(LongWord)); Dest.Size:=DestLen; zstream.next_in:=Pointer(LongWord(Source.Memory)+SizeOf(LongWord)); zstream.avail_in:=SourceLen-SizeOf(LongWord); zstream.next_out:=Dest.Memory; zstream.avail_out:=DestLen; ZDecompressCheck(InflateInit(zstream)); try ZDecompressCheck(inflate(zstream,Z_NO_FLUSH)); finally ZDecompressCheck(inflateEnd(zstream)); end;end;

用一个4M的文件试试,效率提高近70倍。
同样道理,在压缩的时候,如果能预先知道压缩后的大小,也能提高效率不少,但这似乎是不可能的,也不能盲目的给outStream.Size一个"足够大"的数值,只能按引擎的原理估算一个最接近的数值,zlib推荐的为:
((SourceLen+(SourceLen div 10)+12)+255) and not 255
因此,最有效率的压缩程序为:
procere ZlibCompressStream2(Source,Dest:TMemoryStream; CompressLevel:TZCompressi);var zstream: TZStreamRec; SourceLen,DestLen:LongWord;begin FillChar(zstream,SizeOf(TZStreamRec),0); SourceLen:=Source.Size; DestLen:=SizeOf(LongWord)+((SourceLen+(SourceLen div 10)+12)+255) and not 255; Dest.Size:=DestLen; Dest.Position:=0; Dest.Write(SourceLen,Sizeof(LongWord)); zstream.next_in:=Source.Memory; zstream.avail_in:=SourceLen; zstream.next_out:=Pointer(LongWord(Dest.Memory)+SizeOf(LongWord)); zstream.avail_out:=DestLen-SizeOf(longWord); ZCompressCheck(DeflateInit(zstream,ZLevels[CompressLevel])); try ZCompressCheck(deflate(zstream,Z_FINISH)); finally ZCompressCheck(deflateEnd(zstream)); end; Dest.Size:=zstream.total_out+SizeOf(LongWord);end;

J. 关于zlib解压缩的问题~

压缩与解压缩的时候,分别有2个不同的版本,分别是safe和普通的版本。2个版本要对应起来。

你在解压缩的时候,注意缓冲区大小了吗?缓冲区够用了吗?在压缩前,保存一下这个压缩前的原始的长度,然后解压前,分配一块至少这么大的内存。

你实际调试过吗?比如,你可以先去掉文件IO的过程,只是对一个字符串进行压缩/解压,然后看看是否正确;然后再加上文件IO,看看存取的过程是否正确。压缩后的文件应该以二进制方式打开对吧。

热点内容
c语言小数四舍五入 发布:2024-05-19 16:23:28 浏览:524
数据库被注入攻击 发布:2024-05-19 16:21:31 浏览:834
微信忘记密码从哪里看 发布:2024-05-19 16:06:37 浏览:32
宝马x4贷款买哪个配置好 发布:2024-05-19 15:56:03 浏览:22
微控pid算法 发布:2024-05-19 15:46:31 浏览:135
云盘视频解压密码 发布:2024-05-19 15:23:17 浏览:848
和平精英怎么改地区位置安卓 发布:2024-05-19 15:19:05 浏览:286
酒店的路由器如何配置 发布:2024-05-19 15:10:44 浏览:500
rpgmaker脚本 发布:2024-05-19 14:48:58 浏览:407
hds存储虚拟化 发布:2024-05-19 14:47:09 浏览:21