當前位置:首頁 » 文件管理 » zlib解壓zip

zlib解壓zip

發布時間: 2022-07-01 21:50:21

❶ delphi中用zlib怎樣壓縮解壓

數據壓縮和解壓的示例代碼:

{壓縮流}
function CompressStream(ASrcStream: TStream; ALevel: TSfCompressionLevel): TStream;
var
SrcData,Buffer:Pointer;
BufSize:Integer;
begin
Buffer:=nil;
Result:=nil;
BufSize:=0;
GetMem(SrcData,ASrcStream.Size);
ASrcStream.Position:=0;
ASrcStream.Read(SrcData^,ASrcStream.Size);

try
try
SfCompressBuf(SrcData,ASrcStream.Size,Buffer,BufSize,ALevel);
except
on E:Exception do
SfRaiseException(E,'Exception raised in CompressStream call');
end;
finally
FreeMem(SrcData);
SrcData:=nil;
end;

//由於try...except塊中重引發了異常,所以在發生了異常的情況下,以下的代碼不會執行
Result:=TMemoryStream.Create;
Result.Write(Buffer^,BufSize);
FreeMem(Buffer);
end;

{解壓流}
function CompressStream(ASrcStream: TStream; ALevel: TSfCompressionLevel): TStream;
var
SrcData,Buffer:Pointer;
BufSize:Integer;
begin
Buffer:=nil;
Result:=nil;
BufSize:=0;
GetMem(SrcData,ASrcStream.Size);
ASrcStream.Position:=0;
ASrcStream.Read(SrcData^,ASrcStream.Size);

try
try
SfCompressBuf(SrcData,ASrcStream.Size,Buffer,BufSize,ALevel);
except
on E:Exception do
SfRaiseException(E,'Exception raised in CompressStream call');
end;
finally
FreeMem(SrcData);
SrcData:=nil;
end;

//由於try...except塊中重引發了異常,所以在發生了異常的情況下,以下的代碼不會執行
Result:=TMemoryStream.Create;
Result.Write(Buffer^,BufSize);
FreeMem(Buffer);
end;

{壓縮位元組數組}
function CompressBytes(ASrcBytes: TBytes; ALevel: TSfCompressionLevel): TBytes;
var
Buffer:Pointer;
BufSize:Integer;
begin
Buffer:=nil;
BufSize:=0;

try
SfCompressBuf(@ASrcBytes[0],Length(ASrcBytes),Buffer,BufSize,ALevel);
SetLength(Result,BufSize);
Move(Buffer^,Result[0],BufSize);
except
on E:Exception do
SfRaiseException(E,'Exception raised in CompressBytes call');
end;

//由於try...except塊中重引發了異常,所以在發生了異常的情況下,以下的代碼不會執行
FreeMem(Buffer);
end;

{解壓位元組數組}
function DecompressBytes(ASrcBytes: TBytes): TBytes;
var
Buffer:Pointer;
BufSize:Integer;
begin
Buffer:=nil;
BufSize:=0;

try
SfDecompressBuf(@ASrcBytes[0],Length(ASrcBytes),0,Buffer,BufSize);
SetLength(Result,BufSize);
Move(Buffer^,Result[0],BufSize);
except
on E:Exception do
SfRaiseException(E,'Exception raised in DecompressBytes call');
end;

//由於try...except塊中重引發了異常,所以在發生了異常的情況下,以下的代碼不會執行
FreeMem(Buffer);
end;

❷ zlib下載文件在哪

第一步 下載並解壓zlib壓縮包

打開zlib官網,找到下載鏈接,右鍵復制地址:

在Linux中使用wget命令下載,執行如下命令開始下載:

wget http://zlib.net/zlib-1.2.8.tar.gz

解壓:

tar zxvf zlib-1.2.8.tar.gz

第二步 開始安裝

安裝過程比較簡單,進入zlib的解壓目錄,依次執行下面幾條命令即可:

配置:

./configure

如果之前沒有安裝gcc(C 編譯器),這一步將報如下錯誤信息::

xueliang@dev:~/download/zlib-1.2.8$ ./configure

Checking for gcc…

Compiler error reporting is too harsh for ./configure (perhaps remove -Werror).

** ./configure aborting.

xueliang@dev:~/download/zlib-1.2.8$

希望我的回答能對你有所幫助。

❸ 怎麼用zlib生成標准zip壓縮文件和解壓縮zip文件

你用的是什麼壓縮軟體?7-Zip? rar是Winrar的私有格式,其它壓縮軟體通常只能打開和解壓縮,而不能生成(否則必須得到Winrar的授權)。 其它你用7z格式就可以了,Winrar等都可以打開7z(7-Zip是開源軟體)。你發給別人7z格式,他不論裝什麼壓縮.

❹ 在VC中如何使用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.

❺ 如何發揮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;

❻ 關於zlib解壓縮的問題~

壓縮與解壓縮的時候,分別有2個不同的版本,分別是safe和普通的版本。2個版本要對應起來。

你在解壓縮的時候,注意緩沖區大小了嗎?緩沖區夠用了嗎?在壓縮前,保存一下這個壓縮前的原始的長度,然後解壓前,分配一塊至少這么大的內存。

你實際調試過嗎?比如,你可以先去掉文件IO的過程,只是對一個字元串進行壓縮/解壓,然後看看是否正確;然後再加上文件IO,看看存取的過程是否正確。壓縮後的文件應該以二進制方式打開對吧。

❼ 有沒有會使用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; //創建解壓文件的文件指針
errno_t err; //錯誤變數的定義
//打開欲解壓的文件
err = fopen_s(&fp3, SrcName, "rb");
if (err)
{
printf("文件打開失敗! \n");
return false;
}

//獲取欲解壓文件的大小
long ucur = ftell(fp3);
fseek(fp3, 0L, SEEK_END);
long ufileLength = ftell(fp3);
fseek(fp3, ucur, SEEK_SET);

//讀取文件到buffer
int count = fread(uSorceBuffer, 1, ufileLength, fp3);
fclose(fp3);

uLongf uDestBufferLen = 1024*1024*11;//此處長度需要足夠大以容納解壓縮後數據
char* uDestBuffer = (char*)::calloc((uInt)uDestBufferLen, 1);
//解壓縮buffer中的數據
err = uncompress((Bytef*)uDestBuffer, (uLongf*)&uDestBufferLen, (Bytef*)uSorceBuffer, (uLongf)ufileLength);

if (err != Z_OK)
{
return false;
}

//創建一個文件用來寫入解壓縮後的數據
err = fopen_s(&fp4, DestName, "wb");
if (err)
{
printf("解壓縮文件創建失敗! \n");
return false;
}

//寫入數據
fwrite(uDestBuffer, uDestBufferLen, 1, fp4);
fclose(fp4);

return true;

❽ 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;
}

❾ 為什麼用zlib.dll解壓不成功呢可以壓縮,但是不能解壓

zlib解縮時,要提供壓縮前的大小。所以一般壓縮前,要取得要壓縮數據的大小,壓縮後要自己在壓縮後的數據前加上一段自定義的數據,有於保存壓縮前的大小,以便於在解壓縮時能夠獲取壓縮前的大小。解壓縮前,可以根據自定義的這段數據,來獲取到壓縮前的大小,做為參數提供給解壓縮的api的sourceLen。

❿ 如何解壓用zlib壓縮的文件

360軟體寶庫裡面下載個快壓就好了

熱點內容
電腦硬體消息查詢腳本 發布:2025-03-16 16:22:39 瀏覽:865
寶馬五系降價取消了哪些配置 發布:2025-03-16 16:09:41 瀏覽:239
學班java 發布:2025-03-16 16:09:00 瀏覽:597
切金磚解壓 發布:2025-03-16 16:08:45 瀏覽:773
資料庫流向圖 發布:2025-03-16 16:08:14 瀏覽:35
sql存儲過程更新 發布:2025-03-16 16:08:13 瀏覽:161
安卓手機為什麼比蘋果耗流量高 發布:2025-03-16 16:06:32 瀏覽:230
榮耀加密指紋 發布:2025-03-16 16:02:27 瀏覽:398
sql判斷資料庫是否存在 發布:2025-03-16 16:01:17 瀏覽:908
怎麼從ps裡面看電腦配置 發布:2025-03-16 16:00:37 瀏覽:47