国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 商都县| 平昌县| 若尔盖县| 平舆县| 青州市| 济阳县| 土默特左旗| 高邮市| 阳原县| 易门县| 额济纳旗| 庆云县| 静乐县| 石门县| 太仆寺旗| 东乌珠穆沁旗| 洞口县| 平原县| 泸水县| 井研县| 辉县市| 克山县| 阜宁县| 古丈县| 江川县| 贵南县| 汝阳县| 米泉市| 双鸭山市| 南投市| 卢氏县| 肇源县| 卢龙县| 土默特左旗| 昭觉县| 岗巴县| 巴林左旗| 平顶山市| 德钦县| 汉寿县| 许昌市|