📄 csdn技术中心 lz77压缩算法(c语言版).htm
字号:
(ULONG)ReadBitFromBitStream(pBuffer, ulBitOffset);<BR>
bit <<= i;<BR> r |=
bit;<BR> }<BR><BR> *pulCodingLength = m + q
+ 1;<BR><BR> return
r+(q<<m)+1;<BR>}<BR><BR><BR>ULONG<BR>CompareStrings(<BR>
PUCHAR string1,<BR> PUCHAR
string2,<BR> ULONG length<BR>
)<BR>{<BR> ULONG i;<BR>
PUCHAR p1, p2;<BR><BR> p1 =
string1;<BR> p2 = string2;<BR><BR> for(i=0;
i<length; i++)<BR> {<BR>
if( *p1==*p2 )<BR> {<BR>
p1++;<BR>
p2++;<BR> }<BR>
else<BR> {<BR>
break;<BR>
}<BR> }<BR><BR> return
p1-string1;<BR>}<BR><BR><BR>void
WINAPI<BR>FindLongestSubstring(<BR> PUCHAR
pSourceString,<BR> PUCHAR pString,<BR>
ULONG ulSourceStringLength,<BR> PULONG
pulSubstringOffset,<BR> PULONG
pulSubstringLength<BR> )<BR>{<BR>
PUCHAR pSrc;<BR><BR> ULONG offset,
length;<BR><BR> ULONG
ulMaxLength;<BR><BR><BR> *pulSubstringOffset = offset =
0;<BR> *pulSubstringLength = 0;<BR><BR> if(
NULL==pSourceString || NULL==pString )<BR> {<BR>
return;<BR> }<BR><BR>
ulMaxLength = ulSourceStringLength;<BR> pSrc =
pSourceString;<BR><BR> while( ulMaxLength>0
)<BR> {<BR> length =
CompareStrings(pSrc, pString, ulMaxLength);<BR><BR>
if( length>*pulSubstringLength )<BR>
{<BR>
*pulSubstringLength = length;<BR>
*pulSubstringOffset = offset;<BR>
}<BR><BR> pSrc++;<BR>
offset++;<BR>
ulMaxLength--;<BR>
}<BR>}<BR><BR><BR>/*<BR>void<BR>FindLongestSubstring(<BR>
PUCHAR pSourceString,<BR> PUCHAR
pString,<BR> ULONG
ulSourceStringLength,<BR> PULONG
pulSubstringOffset,<BR> PULONG
pulSubstringLength<BR> )<BR>{<BR>
PUCHAR pCurrentOffset;<BR> PUCHAR p1,
p2;<BR><BR> ULONG offset, length;<BR><BR>
pCurrentOffset = pSourceString;<BR><BR>
*pulSubstringOffset = offset = 0;<BR>
*pulSubstringLength = length = 0;<BR><BR> while(
pCurrentOffset<pSourceString+ulSourceStringLength )<BR>
{<BR> p1 = pCurrentOffset;<BR>
p2 = pString;<BR><BR><BR>
if( *p1==*p2 )<BR> {<BR>
while(
p1<pSourceString+ulSourceStringLength && *p1==*p2
)<BR> {<BR>
p1++;<BR>
p2++;<BR>
}<BR><BR>
length = p1 - pCurrentOffset;<BR>
}<BR> else<BR>
{<BR> length =
0;<BR> }<BR><BR>
if( length>*pulSubstringLength )<BR>
{<BR>
*pulSubstringLength = length;<BR>
*pulSubstringOffset = (ULONG)pCurrentOffset -
(ULONG)pSourceString;<BR> }<BR><BR>
pCurrentOffset++;<BR>
}<BR>}<BR>*/<BR><BR><BR>void<BR>WriteBits(<BR>
PUCHAR pDataBuffer,<BR> ULONG
ulOffsetToWrite,<BR> ULONG ulBits,<BR>
ULONG ulBitLength<BR> )<BR>{<BR>
ULONG ulDwordsOffset;<BR> ULONG
ulBitsOffset, ulBitsRemained;<BR><BR> ulDwordsOffset =
ulOffsetToWrite>>5;<BR> ulBitsOffset =
ulOffsetToWrite&31;<BR> ulBitsRemained = 32 -
ulBitsOffset;<BR><BR> if( 0==ulBitsOffset )<BR>
{<BR>
*((PULONG)pDataBuffer+ulDwordsOffset) = ulBits;<BR>
}<BR> else if( ulBitsRemained>=ulBitLength
)<BR> {<BR>
*((PULONG)pDataBuffer+ulDwordsOffset) |=
(ulBits<<ulBitsOffset);<BR> }<BR>
else<BR> {<BR>
*((PULONG)pDataBuffer+ulDwordsOffset) |=
(ulBits<<ulBitsOffset);<BR>
*((PULONG)pDataBuffer+ulDwordsOffset+1) =
ulBits>>ulBitsRemained;<BR>
}<BR>}<BR><BR>void<BR>ReadBits(<BR> PUCHAR
pDataBuffer,<BR> ULONG
ulOffsetToRead,<BR> PULONG pulBits<BR>
)<BR>{<BR> ULONG ulDwordsOffset;<BR>
ULONG ulBitsOffset, ulBitsLength;<BR><BR>
ulDwordsOffset = ulOffsetToRead>>5;<BR>
ulBitsOffset = ulOffsetToRead&31;<BR>
ulBitsLength = 32 - ulBitsOffset;<BR><BR><BR>
*pulBits = *((PULONG)pDataBuffer+ulDwordsOffset);<BR>
if( 0!=ulBitsOffset )<BR> {<BR>
(*pulBits) >>= ulBitsOffset;<BR>
(*pulBits) |=
(*((PULONG)pDataBuffer+ulDwordsOffset+1))<<ulBitsLength;<BR>
}<BR>}<BR><BR>void<BR>lz77compress(<BR> PUCHAR
pDataBuffer,<BR> ULONG
ulDataLength,<BR> PUCHAR pOutputBuffer,<BR>
PULONG pulNumberOfBits<BR> )<BR>{<BR>
LONG iSlideWindowPtr;<BR>
ULONG ulBytesCoded;<BR> ULONG
ulMaxlength;<BR> PUCHAR
pSlideWindowPtr;<BR> PUCHAR
pUnprocessedDataPtr;<BR><BR> ULONG
offset;<BR> ULONG length;<BR> ULONG
ulCodingLength;<BR><BR> ULONG
ulBitOffset;<BR> UCHAR cc;<BR><BR>
int i;<BR><BR> iSlideWindowPtr =
-MAX_WND_SIZE;<BR> pSlideWindowPtr = NULL;<BR>
ulBitOffset = 0;<BR> ulBytesCoded =
0;<BR><BR> while( ulBytesCoded<ulDataLength
)<BR> {<BR> if(
iSlideWindowPtr>=0 )<BR> {<BR>
pSlideWindowPtr =
pDataBuffer+iSlideWindowPtr;<BR>
ulMaxlength = MAX_WND_SIZE;<BR><BR>
}<BR> else if(
iSlideWindowPtr>=-MAX_WND_SIZE )<BR>
{<BR> pSlideWindowPtr
= pDataBuffer;<BR>
ulMaxlength = MAX_WND_SIZE + iSlideWindowPtr;<BR>
}<BR> else<BR>
{<BR>
pSlideWindowPtr = NULL;<BR>
ulMaxlength = 0;<BR> }<BR><BR>
pUnprocessedDataPtr = pDataBuffer +
ulBytesCoded;<BR> if(
ulMaxlength>ulDataLength-ulBytesCoded )<BR>
{<BR> ulMaxlength =
ulDataLength-ulBytesCoded;<BR>
}<BR><BR>
FindLongestSubstring(<BR>
pSlideWindowPtr,<BR>
pUnprocessedDataPtr,<BR>
ulMaxlength,<BR>
&offset,<BR>
&length<BR>
);<BR><BR> assert(
length<=MAX_WND_SIZE );<BR> assert(
offset<MAX_WND_SIZE );<BR><BR>
if(length>1)<BR> {<BR><BR>
Write1ToBitStream(pOutputBuffer,
ulBitOffset);<BR>
ulBitOffset++;<BR><BR>
for(i=0; i<OFFSET_CODING_LENGTH; i++,
ulBitOffset++)<BR>
{<BR>
if( (offset>>i)&1 )<BR>
{<BR>
Write1ToBitStream(pOutputBuffer,
ulBitOffset);<BR>
}<BR>
else<BR>
{<BR>
Write0ToBitStream(pOutputBuffer,
ulBitOffset);<BR>
}<BR> }<BR><BR>
ulCodingLength =
WriteGolombCode(length, pOutputBuffer, ulBitOffset);<BR><BR>
ulBitOffset +=
ulCodingLength;<BR>
iSlideWindowPtr += length;<BR>
ulBytesCoded += length;<BR><BR>
}<BR> else<BR>
{<BR>
Write0ToBitStream(pOutputBuffer, ulBitOffset);<BR>
ulBitOffset++;<BR><BR>
cc =
(*pUnprocessedDataPtr);<BR>
for(i=0; i<8; i++, ulBitOffset++)<BR>
{<BR>
if( (cc>>i)&1 )<BR>
{<BR>
Write1ToBitStream(pOutputBuffer, ulBitOffset);<BR>
}<BR>
else<BR>
{<BR>
Write0ToBitStream(pOutputBuffer, ulBitOffset);<BR>
}<BR>
}<BR><BR>
iSlideWindowPtr++;<BR>
ulBytesCoded++;<BR>
}<BR><BR> }<BR><BR> if(
ulBytesCoded!=ulDataLength )<BR> {<BR>
assert(ulBytesCoded==ulDataLength);<BR>
}<BR><BR> *pulNumberOfBits =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -