LZ77作为关键字可以搜索到一份被转载了很多次的源码,不过这份代码基本上一行注释都没有,阅读学习非常的不方便。于是决定给这个代码的关键函数加上注释,作为阅读的学习笔记。
/********************************************************************* * * Project description: * Lz77 compression/decompression algorithm. * *********************************************************************/ #include <windows.h> #include <conio.h> #include <stdio.h> #include <assert.h> #define OFFSET_CODING_LENGTH (10) #define MAX_WND_SIZE 1024 //#define MAX_WND_SIZE (1<<OFFSET_CODING_LENGTH) #define OFFSET_MASK_CODE (MAX_WND_SIZE-1) const ULONG m=3; //m是Golomb编码使用的常数 UCHAR __buffer1__[0x200000]; UCHAR __buffer2__[0x200000];
|
因为只分析重点的函数,所以代码只是片断。上面是源码用到的常量的定义。
首先看Write1ToBitStream函数,用来在给定的Buff偏移位置写入1:
void Write1ToBitStream( PUCHAR pBuffer, ULONG ulBitOffset ) {
ULONG ulByteBoundary; ULONG ulOffsetInByte; //计算ulBitOffset右移3位,即判断所给定的位偏移,相对pBuffer来说是第几个字符的地址,每个字符占8个bit //ulBitOffset与0x00000111做与运算可以知道要在所指向的那个字符的第几个位置置1 ulByteBoundary = ulBitOffset>>3 ulOffsetInByte = ulBitOffset&7; *(pBuffer+ulByteBoundary) |= (1<<ulOffsetInByte); } |
读取的过程正好和写过程是对称: