1. 程式人生 > >zlib庫compress和uncompress函式的使用方法

zlib庫compress和uncompress函式的使用方法

zlib(http://zlib.net/)提供了簡潔高效的In-Memory資料壓縮和解壓縮系列API函式,很多應用都會用到這個庫,其中compress和uncompress函式是最基本也是最常用的。不過很奇怪的是,compress和uncompress函式儘管已經非常的簡單,卻仍然有不少人用得不好,其實歸根結底還是在於有些事情沒有弄明白,這裡大家先看下面的程式碼。

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <zlib.h>
  5. int main(int argc, 
    char* argv[])  
  6. {  
  7.     char text[] = "zlib compress and uncompress test\[email protected]\n2012-11-05\n";  
  8.     uLong tlen = strlen(text) + 1;  /* 需要把字串的結束符'\0'也一併處理 */
  9.     char* buf = NULL;  
  10.     uLong blen;  
  11.     /* 計算緩衝區大小,併為其分配記憶體 */
  12.     blen = compressBound(tlen); /* 壓縮後的長度是不會超過blen的 */
  13.     if((buf = (char
    *)malloc(sizeof(char) * blen)) == NULL)  
  14.     {  
  15.         printf("no enough memory!\n");  
  16.         return -1;  
  17.     }  
  18.     /* 壓縮 */
  19.     if(compress(buf, &blen, text, tlen) != Z_OK)  
  20.     {  
  21.         printf("compress failed!\n");  
  22.         return -1;  
  23.     }  
  24.     /* 解壓縮 */
  25.     if(uncompress(text, &tlen, buf, blen) != Z_OK)  
  26.     {  
  27.         printf("uncompress failed!\n");  
  28.         return -1;  
  29.     }  
  30.     /* 列印結果,並釋放記憶體 */
  31.     printf("%s", text);  
  32.     if(buf != NULL)  
  33.     {  
  34.         free(buf);  
  35.         buf = NULL;  
  36.     }  
  37.     return 0;  
  38. }  
zlib處理的物件是Bytef*位元組流,很多人遇到字串就會混淆了,其實很簡單,位元組流是沒有結束符的,需要配備長度資訊,所以處理字串的時候需要把結束符也當成一個普通的位元組,這樣計算長度的時候也需要算它一份。另外絕大部分人都想動態分配緩衝區,也就是說需要多少再給多少,其實zlib本身有提供compressBound函式用於計算壓縮後緩衝區長度的上限值,不需要額外再設計一些不適當的預測演算法,不過解壓縮的時候沒有提供長度的預測,由於compress和uncompress一般都是成對使用的,預先儲存好原文的長度即可。

相關推薦

zlibcompressuncompress函式的使用方法

zlib(http://zlib.net/)提供了簡潔高效的In-Memory資料壓縮和解壓縮系列API函式,很多應用都會用到這個庫,其中compress和uncompress函式是最基本也是最常用的。不過很奇怪的是,compress和uncompress函式儘管已經非

Python資料型別相關函式方法

只列出了常用的。 簡單資料型別: 整數(int,long) 123,不用考慮範圍問題。 浮點數(float) 1.23 布林值(bool) True,False 空型別(None) 空物件,表示未定義,它的布林值為False 高階資料型別: 字串(str) "

linux動態libinlcude 載入方法

       眾所周知,Linux動態庫的預設搜尋路徑是/lib和/usr/lib。動態庫被建立後,一般都複製到這兩個目錄中。當程式執行時需要某動態庫,並且該動態庫還未載入到記憶體中,則系統會自動到這兩個預設搜尋路徑中去查詢相應的動態庫檔案,然後載入該檔案到記憶體中,這

使用zlibcompress函式uncompress函式

        zlib是一個免費、通用、無損的資料壓縮庫,而且還是跨平臺的。zlib具有同winzip和winrar等商業軟體相比毫不遜色的壓縮率,已經成功應用在諸如MySQL、Java、3DMax、甚至是微軟的DirectX等大型的系統中。目前Z1ib的最新版本是1.2

使用zlib開源uncompress函式解壓時出現記憶體崩潰問題及error LNK2026: 模組對於 SAFESEH 映像是不安全的問題

         最近的專案中需要解壓縮,打算使用zlib開源庫在VS2013中開發,但是在使用uncompress函式進行解壓縮過程中遇到了記憶體崩潰現象,錯誤發生在inflate_fast裡面的彙編模組。經過分析發現是在編譯zlibwapi.dll的時候使用匯編模組造成的

C C++ 的標準分別有自己的 locale 操作方法,C 標準的 locale 設定函式是 setlocale(),而 C++ 標準有 locale 類流物件的 imbue() 方法(gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People&#

轉自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/  [在此向原文作者說聲謝謝!若有讀者看到文章轉載時請寫該轉載地址,不要寫我的BLOG地址。尊重他人的勞動成果 ^_^ ] C 和 C++ 的標準庫分別有自己的

【python學習筆記】python函式定義傳參方法說明

一、函式定義方式 函式定義用關鍵字def,其引數傳遞不用設定型別,也不用定義返回,然後在函式名稱後加上:號,這點和java很不一樣,相對來說更加簡單了;另外包含關係上用四個空格來標識,而非java的;號; 如下為一個範例,定義了一個函式用來生成任意上界的菲波那契數列: # -*- c

【機器學習演算法實現】logistic迴歸 基於PythonNumpy函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【機器學習演算法實現】kNN演算法 手寫識別——基於PythonNumPy函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

PHP反射實現對類的方法依賴注入建構函式依賴注入

前段時間一直在看tp5 發現他內部實現了控制器的依賴注入。。下面 我通過程式碼來說明一下是怎麼實現的。 首先我們準備好幾個類檔案  我們先看目錄安排 其中 start.php是啟動檔案 <?php /** * Created by PhpStorm. * User: A

unity碰撞檢測觸發器的方法函式

碰撞檢測涉及三個函式: 當與物體碰撞的一瞬間:OnCollisionEnter(Collision  collision),collisionInfo是撞到的物體的碰撞資訊; 當在與物體持續碰撞接觸期間:OnCollisionStay(Collision collisio

linux下封裝函式——動態.so靜態.a(程式碼實現及連結方式)

在linux環境下的連結庫分為靜態連結庫(.a庫)和動態連結庫(.so庫),其作用是把C程式編譯好做成一種可執行連結檔案,主程式檔案呼叫這些程式的函式介面是可以使用a庫或so庫,在主程式中只需要include含有庫中提供的函式介面宣告的標頭檔案即可。所以學會如何

Java的輸入輸出、if...else if...else判斷、Java中列印陣列、Java中陣列排序、檢視函式方法的原始碼、命令列引數

Java的輸入和輸出: 輸入: import java.util.Scanner Scanner s = new Scanner(System.in); //通過new Scanner(System.in)建立一個Scanner物件,控制檯會一直等待輸入,直到敲回車鍵

學習筆記 c++ (boost,訊號函式

#include"iostream" #include"boost/signals.hpp" using namespace std; void my_slot(){   cout<<"my_slot()"<<endl; } void my_sl

win10 64位 vs2013編譯zlibpng

1.zlib編譯 其中第三步進入D:\zlib-1.2.11\zlib-1.2.11\contrib\vstudio\vc12 編譯完成後使用zlib: 1. 包含標頭檔案     屬性--C/C++--常規--附加包含目錄(新增包含.h的目錄) 如:F

迴圈 與 分支語句 字元函式cctype 檔案簡單處理

迴圈 for迴圈 while迴圈 do  while迴圈 通常,入口條件迴圈比出口條件迴圈好,因為迴圈開始前對條件進行檢查 c++11基於範圍的for迴圈    對陣列(或容器類,如:vector和array)的每個元素執行相同操作 int a[5]={1,3,4,5,6};            f

學習Pytbon第十天 函式2 內建方法匿名函式

print( all([1,-5,3]) )#如果可迭代物件裡所有元素都為真則返回真。0不為真print( any([1,2]) )#如果資料裡面任意一個數據為真返回則為真a= ascii([1,2,"天氣"])#把一個記憶體資料物件轉成字串表現形式打印出來print(type(a),[a])bin #把一個

python isinstanceissubclass,區分方法函式,反射

一.isinstance和issubclass 1.isinstance class Animal: def eat(self): print('剛睡醒吃點兒東西') class Cat(Animal): def play(self): print

列舉排列的兩種方法:遞迴列舉 next_permutation()函式

照著《入門經典》理解整理了一下。 ① 以字典序生成1~n的排列 (遞迴列舉) 運用一層層的遞迴,形成一個解答樹。 #include<cstdio> using namespace std; void print_permutation_1(int n

js基礎--函式屬性、方法建構函式

  我們看到在JavaScript程式中,函式是值。對函式執行typeof運算會返回字串"function",但是函式是JavaScript中特殊的物件。因為函式也是物件,它們也可以擁有屬性和方法,就像普通的物件可以擁有屬性和方法一樣。甚至可以用Function()建構函式來建立新的函