LZ77压缩算法实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

)

{

相关文档
最新文档