然后看写入Bit的操作WriteBits,用来在指定的Buff偏移位置写入一串bits:
void ulDwordsOffset = ulOffsetToWrite>>5; if( 0==ulBitsOffset ) |
下面就是LZ77压缩的主体函数:
void ULONG offset; ULONG ulBitOffset; int i; //滑动窗口的初始长度是-MAX_WND_SIZE,因为现在还没有字符被编码,所以滑动窗口的最右端就是编码字串的最前端。 iSlideWindowPtr = -MAX_WND_SIZE; while( ulBytesCoded //当iSildeWindowPtr>=0时,已编码的字串长度已经大于等于滑动窗的长度 } pUnprocessedDataPtr = pDataBuffer + ulBytesCoded; //在已编码的串中搜索待编码字串的最长组合,并记录长度、偏移 FindLongestSubstring( assert( length<=MAX_WND_SIZE ); if(length>1) //如果匹配长度大于1,将首位置1,然后写入偏移的位置,因为搜索窗口长度是10位的,所以这个偏移按照10位的2进制编码写入。最后写入Golomb编码。 Write1ToBitStream(pOutputBuffer, ulBitOffset); for(i=0; i ulCodingLength = WriteGolombCode(length, pOutputBuffer, ulBitOffset); ulBitOffset += ulCodingLength; } //如果匹配长度小于等于1,将首位置0,然后写入对应字符的8位2进制编码 cc = (*pUnprocessedDataPtr); iSlideWindowPtr++; } if( ulBytesCoded!=ulDataLength ) *pulNumberOfBits = ulBitOffset; } |
LZ77的解码过程是上面的逆过程就不敷述了。