This is a class of data compression based on the Lzari algorithm. Haruhiko Okumura the algorithm in C language on July 4, 1989. But it uses some global or static variables, which are inconvenient to use under MFC. I changed it into a C + + class, Make it easy to compress and decompress, and more importantly, I've added two new interfaces that can compress/decompress a memory buffer, not just a file.
A total of 5 external interfaces were provided:
1. Compress/Decompress files
void Compress(const char *lpszInfile,const char *lpszOutfile);
void UnCompress(const char *lpszInfile,const char *lpszOutfile);
Parameters at a glance, you can use these two interfaces as follows:LZARI Lzari;
Lzari.Compress("show.bmp","show.liz"); //压缩文件 show.bmp 到 show.liz
// Lzari.UnCompress("show.liz","show.bmp"); // 解压缩文件 show.liz 到 show.bmp
It's as simple as that.
2. Compress/Decompress a section of memory buffer
void Compress(const BYTE *pInBuffer,int nInLength,const BYTE * &pOutBuffer ,int &nOutLength);
void UnCompress(const BYTE *pInBuffer,int nInLength,const BYTE * &pOutBuffer,int &nOutLength);
The parameters of these two interfaces are also easy to understand, passing in input pointers and lengths, and Lzari will return a read-only output pointer and length. The user does not have to worry about memory allocation, and when it is not necessary to use the output result, call Release (), and here's how to use the example:
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. Free the memory and clear the flag.
void Release();
If you want a Lzari class instance to be both compressed and uncompressed, call release () before the next action call, as follows: Lzari Lzari
Lzari.compress (pinbuffer,ninsize,poutbuffer,noutsize)//Compress Pinbuffer
//
//Do something with Poutbuffer
//
Lzari.release ();
Lzari.uncompress (PINBUFFER2,NINSIZE2,POUTBUFFER2,NOUTSIZE2);//Decompress PInBuffer2
//
//...
//
Lzari.release ();
Please be careful not to call this: lzari.compress (pinbuffer,ninsize,poutbuffer,noutsize);//Compress Pinbuffer
//
//with Poutbuffer Do something
//
Lzari.release ();
Lzari.uncompress (POUTBUFFER,NOUTSIZE,POUTBUFFER2,NOUTSIZE2); Uncompress results for first compression
The Poutbuffer pointer after release () is invalid. If you do not call release (), it can cause poutbuffer and pOutBuffer2 to point to the same memory and cause confusion. It is best to use two class instances to accomplish this.LZARI Lzari;
LZARI UnLzari;
Lzari.Compress(pInBuffer,nInsize,pOutBuffer,nOutSize);//压缩pInBuffer
//
// ...
//
UnLzari.UnCompress(pOutBuffer,nOutSize,pOutBuffer2,nOutSize2); //解压缩第一次压缩的结果
//
// ...
//
Lzari.Release();
UnLzari.Release();
Because the program uses the STL vector template, add the following line to the stdafx.h: #include <vector> Of course, this class is not dependent on MFC and can be used in any C + + program.
In addition, Lzari compression effect than zip Some, the gap is about 5%~10%, compression speed is basically equivalent.
Note: Questions related to algorithms please don't ask me, I don't know:) Other questions Welcome Advice querw@sina.com
This article supporting source code