LZ77压缩算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LZ77压缩算法实验报告
一、实验内容
使用C++编程实现LZ77压缩算法的实现。
二、实验目的
用LZ77实现文件的压缩。
三、实验环境
1、软件环境:Visual C++ 6.0
2、编程语言:C++
四、实验原理
LZ77 算法在某种意义上又可以称为“滑动窗口压缩”,这是由于该算法将一个虚拟的,可以跟随压缩进程滑动的窗口作为术语字典,要压缩的字符串如果在该窗口中出现,则输出其出现位置和长度。使用固定大小窗口进行术语匹配,而不是在所有已经编码的信息中匹配,是因为匹配算法的时间消耗往往很多,必须限制字典的大小才能保证算法的效率;随着压缩的进程滑动字典窗口,使其中总包含最近编码过的信息,是因为对大多数信息而言,要编码的字符串往往在最近的上下文中更容易找到匹配串。
五、LZ77算法的基本流程
1、从当前压缩位置开始,考察未编码的数据,并试图在滑动窗口中找出最长的匹
配字符串,如果找到,则进行步骤2,否则进行步骤3。
2、输出三元符号组( off, len, c )。其中off 为窗口中匹
配字符串相对窗口边
界的偏移,len 为可匹配的长度,c 为下一个字符。然后将窗口向后滑动len + 1 个字符,继续步骤1。
3、输出三元符号组( 0, 0, c )。其中c 为下一个字符。然后将窗口向后滑动
len + 1 个字符,继续步骤1。
六、源程序
/*********************************************************************
*
* Project description:
* Lz77 compression/decompression algorithm.
*
*********************************************************************/
#include
#include
#include
#include
#define OFFSET_CODING_LENGTH (10)
#define MAX_WND_SIZE 1024
//#define MAX_WND_SIZE (1< #define OFFSET_MASK_CODE (MAX_WND_SIZE-1) const ULONG m=3; UCHAR __buffer1__[0x200000]; UCHAR __buffer2__[0x200000]; //////////////////////////////////////////////////////////////////////////////// void Write1ToBitStream( PUCHAR pBuffer, ULONG ulBitOffset ) { ULONG ulByteBoundary; ULONG ulOffsetInByte; ulByteBoundary = ulBitOffset>>3 ; ulOffsetInByte = ulBitOffset&7; *(pBuffer+ulByteBoundary) |= (1< } void Write0ToBitStream( PUCHAR pBuffer, ULONG ulBitOffset ) { ULONG ulByteBoundary; ULONG ulOffsetInByte; ulByteBoundary = ulBitOffset>>3 ; ulOffsetInByte = ulBitOffset&7; *(pBuffer+ulByteBoundary) &= (~(1< } ULONG ReadBitFromBitStream( PUCHAR pBuffer, ULONG ulBitOffset ) { ULONG ulByteBoundary; ULONG ulOffsetInByte; ulByteBoundary = ulBitOffset>>3 ; ulOffsetInByte = ulBitOffset&7; return ((*(PULONG)(pBuffer+ulByteBoundary))>>ulOffsetInByte)&1 ; } ULONG WINAPI WriteGolombCode( ULONG x, PUCHAR pBuffer, ULONG ulBitOffset ) { ULONG q, r; int i; q = (x-1)>>m; r = x-(q< for(i=0; (ULONG)i { Write1ToBitStream(pBuffer, ulBitOffset); } Write0ToBitStream(pBuffer, ulBitOffset); ulBitOffset++; for(i=0; i { if( (r>>i)&1 ) { Write1ToBitStream(pBuffer, ulBitOffset); } else { Write0ToBitStream(pBuffer, ulBitOffset); } } return m+q+1; } ULONG ReadGolombCode( PULONG pulCodingLength, PUCHAR pBuffer, ULONG ulBitOffset ) {