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.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:
BYTE *pOutBuffer = NULL;
int nOutSize = 0;
char szInBuffer = "This is a class for compress and uncompress";
// 用pOutBuffer 做一些事情
3. Free the memory and clear the flag.
If you want a Lzari class instance to be both compressed and uncompressed, call release () before the next action call, as follows:
Lzari Lzari Please be careful not to call this:
Lzari.compress (pinbuffer,ninsize,poutbuffer,noutsize)//Compress Pinbuffer
//Do something with Poutbuffer
Lzari.uncompress (PINBUFFER2,NINSIZE2,POUTBUFFER2,NOUTSIZE2);//Decompress PInBuffer2
lzari.compress (pinbuffer,ninsize,poutbuffer,noutsize);//Compress Pinbuffer
//with Poutbuffer Do something
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.
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 firstname.lastname@example.org
This article supporting source code