程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 實現LZARI壓縮算法的C++類

實現LZARI壓縮算法的C++類

編輯:C++入門知識
下載源代碼
  
   這是一個基於LZARI算法的數據壓縮的類.Haruhiko Okumura 於1989年7月4日用c語言寫實現了這個算法.但是上面用到了一些全局或靜態的變量,在MFC下用起來很不方便.我把它改寫成了一個c++類,使它可以方便的壓縮和解壓縮,更重要的是,我新增加了兩個接口,這個類可以壓縮/解壓縮一段內存緩沖區,而不僅僅是文件.
   一共提供了5個對外接口:
  
   1.壓縮/解壓縮文件
void Compress(const char *lpszInfile,const char *lpszOutfile); void UnCompress(const char *lpszInfile,const char *lpszOutfile); 參數一目了然,可以像下面這樣使用這兩個接口: LZARI Lzari; Lzari.Compress("show.bmp","show.liz"); //壓縮文件 show.bmp 到 show.liz // Lzari.UnCompress("show.liz","show.bmp"); // 解壓縮文件 show.liz 到 show.bmp 就這麼簡單.
  
   2.壓縮/解壓縮一段內存緩沖區void Compress(const BYTE *pInBuffer,int nInLength,const BYTE * &pOutBuffer ,int &nOutLength); void UnCompress(const BYTE *pInBuffer,int nInLength,const BYTE * &pOutBuffer,int &nOutLength); 這兩個接口的參數也不難理解,分別傳入輸入指針和長度,LZARI會返回一個只讀的輸出指針和長度.使用者不用擔心內存分配的問題,當不需要使用輸出結果時調用Release()就行了,以下是使用示例: LZARI Lzari; BYTE *pOutBuffer = NULL; int nOutSize = 0; char szInBuffer[] = "This is a class for compress and uncompress"; Lzari.Compress(szInBuffer,strlen(szInBuffer),pOutBuffer,nOutSize);//壓縮pInBuffer // // 用pOutBuffer 做一些事情 // Lzari.Release(); 3.釋放內存,並清空標志.void Release();若想讓一個LZARI類實例既進行壓縮操作又進行解壓縮操作,請在後一個操作調用之前調用一下Release(); 如下所示:LZARI Lzari; Lzari.Compress(pInBuffer,nInsize,pOutBuffer,nOutSize);//壓縮pInBuffer // // 用pOutBuffer 做一些事情 // Lzari.Release(); Lzari.UnCompress(pInBuffer2,nInsize2,pOutBuffer2,nOutSize2); //解壓縮pInBuffer2 // // ... // Lzari.Release(); 請注重千萬不要這樣調用: Lzari.Compress(pInBuffer,nInsize,pOutBuffer,nOutSize);//壓縮pInBuffer // // 用pOutBuffer 做一些事情 // Lzari.Release(); Lzari.UnCompress(pOutBuffer,nOutSize,pOutBuffer2,nOutSize2); //解壓縮第一次壓縮的結果 因為Release()後pOutBuffer的指針就無效了.而假如不調用Release()又會導致pOutBuffer和pOutBuffer2指向同一段內存從而導致混亂.碰到這種情況最好使用兩個類實例來完成.如下: LZARI Lzari; LZARI UnLzari; Lzari.Compress(pInBuffer,nInsize,pOutBuffer,nOutSize);//壓縮pInBuffer // // ... // UnLzari.UnCompress(pOutBuffer,nOutSize,pOutBuffer2,nOutSize2); //解壓縮第一次壓縮的結果 // // ... // Lzari.Release(); UnLzari.Release(); 由於程序中用到了STL的vector模板,請在stdafx.h中加入以下一行: #include <vector>.當然,這個類並不依靠於MFC,可以使用在任何C++程序中.
   另外,LZARI壓縮的效果比zip差一些,差距大約是5%~10%,壓縮速度則基本相當.
   注:與算法有關的問題請不要問我,我也不知道 :) 其他問題歡迎指教 [email protected]
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved