国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

實(shí)現(xiàn)LZARI壓縮算法的C++類

2019-11-17 05:32:39
字體:
供稿:網(wǎng)友
下載源代碼

這是一個基于LZARI算法的數(shù)據(jù)壓縮的類.Haruhiko Okumura 于1989年7月4日用c語言寫實(shí)現(xiàn)了這個算法.但是上面用到了一些全局或靜態(tài)的變量,在MFC下用起來很不方便.我把它改寫成了一個c++類,使它可以方便的壓縮和解壓縮,更重要的是,我新增加了兩個接口,這個類可以壓縮/解壓縮一段內(nèi)存緩沖區(qū),而不僅僅是文件.
一共提供了5個對外接口:

1.壓縮/解壓縮文件
void ComPRess(const char *lpszInfile,const char *lpszOutfile);void UnCompress(const char *lpszInfile,const char *lpszOutfile);參數(shù)一目了然,可以像下面這樣使用這兩個接口:LZARI Lzari;Lzari.Compress("show.bmp","show.liz"); //壓縮文件 show.bmp 到 show.liz// Lzari.UnCompress("show.liz","show.bmp"); // 解壓縮文件 show.liz 到 show.bmp就這么簡單.

2.壓縮/解壓縮一段內(nèi)存緩沖區(qū)void Compress(const BYTE *pInBuffer,int nInLength,const BYTE * &pOutBuffer ,int &nOutLength);void UnCompress(const BYTE *pInBuffer,int nInLength,const BYTE * &pOutBuffer,int &nOutLength);這兩個接口的參數(shù)也不難理解,分別傳入輸入指針和長度,LZARI會返回一個只讀的輸出指針和長度.使用者不用擔(dān)心內(nèi)存分配的問題,當(dāng)不需要使用輸出結(jié)果時調(diào)用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.釋放內(nèi)存,并清空標(biāo)志.void Release();若想讓一個LZARI類實(shí)例既進(jìn)行壓縮操作又進(jìn)行解壓縮操作,請在后一個操作調(diào)用之前調(diào)用一下Release();如下所示:LZARI Lzari;Lzari.Compress(pInBuffer,nInsize,pOutBuffer,nOutSize);//壓縮pInBuffer//// 用pOutBuffer 做一些事情//Lzari.Release();Lzari.UnCompress(pInBuffer2,nInsize2,pOutBuffer2,nOutSize2); //解壓縮pInBuffer2//// ...//Lzari.Release();請注重千萬不要這樣調(diào)用:Lzari.Compress(pInBuffer,nInsize,pOutBuffer,nOutSize);//壓縮pInBuffer//// 用pOutBuffer 做一些事情//Lzari.Release();Lzari.UnCompress(pOutBuffer,nOutSize,pOutBuffer2,nOutSize2); //解壓縮第一次壓縮的結(jié)果因為Release()后pOutBuffer的指針就無效了.而假如不調(diào)用Release()又會導(dǎo)致pOutBuffer和pOutBuffer2指向同一段內(nèi)存從而導(dǎo)致混亂.碰到這種情況最好使用兩個類實(shí)例來完成.如下:LZARI Lzari;LZARI UnLzari;Lzari.Compress(pInBuffer,nInsize,pOutBuffer,nOutSize);//壓縮pInBuffer//// ...//UnLzari.UnCompress(pOutBuffer,nOutSize,pOutBuffer2,nOutSize2); //解壓縮第一次壓縮的結(jié)果//// ...//Lzari.Release();UnLzari.Release();由于程序中用到了STL的vector模板,請在stdafx.h中加入以下一行: #include <vector>.當(dāng)然,這個類并不依靠于MFC,可以使用在任何C++程序中.
另外,LZARI壓縮的效果比zip差一些,差距大約是5%~10%,壓縮速度則基本相當(dāng).
注:與算法有關(guān)的問題請不要問我,我也不知道 :) 其他問題歡迎指教 querw@sina.com

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 枝江市| 阜宁县| 临澧县| 克山县| 寿宁县| 阳城县| 枝江市| 德兴市| 泸水县| 青田县| 壤塘县| 霍山县| 香港| 海城市| 康马县| 含山县| 凤山市| 那坡县| 个旧市| 五大连池市| 辽阳县| 绥芬河市| 枣庄市| 班戈县| 双鸭山市| 临湘市| 潼南县| 扎鲁特旗| 沙洋县| 永城市| 崇义县| 克什克腾旗| 金门县| 唐海县| 深泽县| 普格县| 乌鲁木齐市| 蒙山县| 连山| 平陆县| 鄂伦春自治旗|