C zip檔案的解壓與壓縮

2021-07-03 17:42:13 字數 2789 閱讀 7296

2、在專案中新增相關檔案

在debug中新增zlib1.dll檔案,其他檔案載入到專案中

3、實現的**

#pragma comment(lib,"zlib1")

//壓縮檔案

int compress(char * destname, const char *srcname)

;  //壓縮檔案時的源buffer

file* fp;  //開啟欲壓縮檔案時檔案的指標

file* fp1;  //建立壓縮檔案時的指標

errno_t err; //錯誤變數的定義

err = fopen_s(&fp, srcname, "r+b");

//獲取檔案長度

long cur = ftell(fp);

fseek(fp, 0l, seek_end);

long filelength = ftell(fp);

fseek(fp, cur, seek_set);

//讀取檔案到buffer

fread(sourcebuffer, filelength, 1, fp);

fclose(fp);

//壓縮buffer中的資料

ulongf sourcebufferlen = 102400;

char* destbuffer = (char*)::calloc((uint)sourcebufferlen, 1);

err = compress((bytef*)destbuffer, (ulongf*)&sourcebufferlen, (const bytef*)sourcebuffer, (ulongf)filelength);

if (err != z_ok)

//建立乙個檔案用來寫入壓縮後的資料

err = fopen_s(&fp1, destname, "w+b");

if (!fp1)

fwrite(destbuffer, sourcebufferlen, 1, fp1);

cout << "壓縮結束" << endl;

fclose(fp1);

return 0;

}//解壓縮檔案

int uncompress(char * destname, const char *srcname)

;  //解壓縮檔案時的源buffer

file* fp3;  //開啟欲解壓檔案的檔案指標

file* fp4;  //建立解壓檔案的檔案指標

errno_t err; //錯誤變數的定義

//開啟欲解壓的檔案

err = fopen_s(&fp3, srcname, "r+b");

if (err)

//獲取欲解壓檔案的大小

long ucur = ftell(fp3);

fseek(fp3, 0l, seek_end);

long ufilelength = ftell(fp3);

fseek(fp3, ucur, seek_set);

//讀取檔案到buffer

fread(usorcebuffer, ufilelength, 1, fp3);

fclose(fp3);

ulongf udestbufferlen = 1024000;//此處長度需要足夠大以容納解壓縮後資料

char* udestbuffer = (char*)::calloc((uint)udestbufferlen, 1);

//解壓縮buffer中的資料

/*int uncompress(bytef *dest, ulongf *destlen, const bytef *source, ulong sourcelen);

uncompress 函式將 source 緩衝區的內容解壓縮到 dest 緩衝區。

sourcelen 是 source 緩衝區的大小(以位元組計)。注意函式的第二

個引數 destlen 是傳址呼叫。當呼叫函式時,destlen 表示 dest

緩衝區的大小, dest 緩衝區要足以容下解壓後的資料。在進行解

壓縮時,需要提前知道被壓縮的資料解壓出來會有多大。這就要求

在進行壓縮之前,儲存原始資料的大小(也就是解壓後的資料的大

小)。這不是 zlib 函式庫的功能,需要我們做額外的工作。當函式

退出後, destlen 是解壓出來的資料的實際大小。

*/err = uncompress((bytef*)udestbuffer, (ulongf*)&udestbufferlen, (bytef*)usorcebuffer, (ulongf)ufilelength);

if (err != z_ok)

//建立乙個檔案用來寫入解壓縮後的資料

err = fopen_s(&fp4, destname, "wb");

if (err)

//printf("寫入資料... \n");

cout << "解壓資料成功!" << endl;

/*size_t fwrite(const void* buffer, size_t size, size_t count, file* stream );

這是fwrite的msdn標準參數列,其中buffer是需要向檔案中寫入的內容在記憶體中的首位址指標,

size是待寫入內容的每個元素的位元組數,count是要寫多少個元素,stream 是檔案指標

*/fwrite(udestbuffer, udestbufferlen, 1, fp4);

//cout << udestbuffer << endl;

fclose(fp4);

return 0;}

C zip壓縮檔案的功能

using system using system.collections.generic using system.io using icsharpcode.sharpziplib.checksums using icsharpcode.sharpziplib.zip namespace buil...

檔案壓縮與解壓

檔案的壓縮 1.讀取檔案的內容 2.統計每個字元出現的次數 int read while read bis.read 1 直至讀到檔案結束 arrays為運算元組的工具類 collections為操作集合工具類 bis.close 3.構建哈弗曼樹,生成哈夫曼編碼 if node.getleftno...

檔案壓縮與解壓

檔案壓縮與解壓思想 1 統計字元出現次數,結合最小堆的性質生成哈夫曼樹 2 對葉節點進行編碼,結點左邊編 0,右邊編1 3 讀取檔案,用哈夫曼編碼代替字元產生新的字元,即壓縮 4 讀取壓縮檔案,進行哈夫曼編碼的解讀產生相應字元,即解壓 例如,對以下資料生成哈夫曼樹,以及產生相應的哈夫曼編碼 自己寫的...