zlib解壓zip文件
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,看看存取的過程是否正確。壓縮後的文件應該以二進制方式打開對吧。