下載源代碼
這是一個基於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]