📄 lz77压缩算法(c语言版).mht
字号:
=20
pSlideWindowPtr;<BR> PUCHAR =
=20
pUnprocessedDataPtr;<BR><BR> ULONG =20
offset;<BR> ULONG length;<BR> =
ULONG=20
ulCodingLength;<BR><BR> ULONG =20
ulBitOffset;<BR> UCHAR cc;<BR><BR> =20
int i;<BR><BR> =
iSlideWindowPtr =3D=20
-MAX_WND_SIZE;<BR> pSlideWindowPtr =3D =
NULL;<BR> =20
ulBitOffset =3D 0;<BR> ulBytesCoded =3D=20
0;<BR><BR> while( ulBytesCoded<ulDataLength=20
)<BR> {<BR> if(=20
iSlideWindowPtr>=3D0 )<BR> =
{<BR> =20
pSlideWindowPtr =3D=20
pDataBuffer+iSlideWindowPtr;<BR> =
=20
ulMaxlength =3D MAX_WND_SIZE;<BR><BR> =
=20
}<BR> else if(=20
iSlideWindowPtr>=3D-MAX_WND_SIZE )<BR> =
=20
{<BR> =
pSlideWindowPtr=20
=3D pDataBuffer;<BR> =20
ulMaxlength =3D MAX_WND_SIZE + =
iSlideWindowPtr;<BR> =20
}<BR> else<BR> =
=20
{<BR> =20
pSlideWindowPtr =3D NULL;<BR> =
=20
ulMaxlength =3D 0;<BR> =
}<BR><BR> =20
pUnprocessedDataPtr =3D pDataBuffer +=20
ulBytesCoded;<BR> if(=20
ulMaxlength>ulDataLength-ulBytesCoded )<BR> =
=20
{<BR> =
ulMaxlength =3D=20
ulDataLength-ulBytesCoded;<BR> =20
}<BR><BR> =20
FindLongestSubstring(<BR> =
=20
pSlideWindowPtr,<BR> =
pUnprocessedDataPtr,<BR> =
=20
ulMaxlength,<BR> =20
&offset,<BR> =20
&length<BR> =20
);<BR><BR> assert(=20
length<=3DMAX_WND_SIZE );<BR> =
assert(=20
offset<MAX_WND_SIZE );<BR><BR> =20
if(length>1)<BR> =
{<BR><BR> =20
=
Write1ToBitStream(pOutputBuffer,=20
ulBitOffset);<BR> =20
ulBitOffset++;<BR><BR> =
=20
for(i=3D0; i<OFFSET_CODING_LENGTH; i++,=20
ulBitOffset++)<BR> =20
{<BR> =20
if( (offset>>i)&1 )<BR> =
=20
{<BR> =
=20
=
Write1ToBitStream(pOutputBuffer,=20
ulBitOffset);<BR> =
=20
}<BR> =20
else<BR> =
=20
{<BR> =
=20
Write0ToBitStream(pOutputBuffer,=20
ulBitOffset);<BR> =
=20
}<BR> =
}<BR><BR> =20
ulCodingLength =3D=20
WriteGolombCode(length, pOutputBuffer, =
ulBitOffset);<BR><BR> =20
ulBitOffset +=3D=20
ulCodingLength;<BR> =20
iSlideWindowPtr +=3D length;<BR> =
=20
ulBytesCoded +=3D length;<BR><BR> =
=20
}<BR> else<BR> =
=20
{<BR> =20
Write0ToBitStream(pOutputBuffer, =
ulBitOffset);<BR> =20
=
ulBitOffset++;<BR><BR> =20
cc =3D=20
(*pUnprocessedDataPtr);<BR> =
=20
for(i=3D0; i<8; i++, ulBitOffset++)<BR> =
=20
{<BR> =
=20
if( (cc>>i)&1 )<BR> =
=20
{<BR> =
=20
=20
Write1ToBitStream(pOutputBuffer, =
ulBitOffset);<BR> =20
}<BR> =
=20
else<BR> =
=20
{<BR> =
=20
=20
Write0ToBitStream(pOutputBuffer, =
ulBitOffset);<BR> =20
}<BR> =
=20
}<BR><BR> =
=20
iSlideWindowPtr++;<BR> =
=20
ulBytesCoded++;<BR> =20
}<BR><BR> }<BR><BR> if(=20
ulBytesCoded!=3DulDataLength )<BR> {<BR> =
=20
=
assert(ulBytesCoded=3D=3DulDataLength);<BR> =20
}<BR><BR> *pulNumberOfBits =3D=20
ulBitOffset;<BR><BR>}<BR><BR><BR>void =
lz77decompress(<BR> =20
PUCHAR pDataBuffer,<BR> ULONG =
ulNumberOfBits,<BR> PUCHAR=20
pOutputBuffer,<BR> PULONG=20
pulNumberOfBytes<BR> )<BR>{<BR> =
LONG=20
iSlideWindowPtr;<BR> =
PUCHAR=20
pSlideWindowPtr;<BR><BR> =
ULONG=20
length, offset;<BR> ULONG =
bit;<BR> =20
UCHAR cc;<BR> int =20
i;<BR><BR> ULONG =
ulBytesDecoded;<BR> =20
ULONG ulBitOffset;<BR><BR> ULONG =
=20
ulCodingLength;<BR> PUCHAR =
pWrite;<BR><BR> =20
iSlideWindowPtr =3D -MAX_WND_SIZE;<BR> =
pWrite =3D=20
(PUCHAR)pOutputBuffer;<BR> ulBitOffset =3D =
0;<BR> =20
ulBytesDecoded =3D 0;<BR><BR><BR> while(=20
ulBitOffset<ulNumberOfBits )<BR> {<BR> =
=20
bit =3D ReadBitFromBitStream(pDataBuffer,=20
ulBitOffset);<BR> =20
ulBitOffset++;<BR><BR> if( =
bit=20
)<BR> {<BR> =
=20
if( iSlideWindowPtr>=3D0 )<BR> =
=20
{<BR> =
=20
pSlideWindowPtr =3D pOutputBuffer +=20
iSlideWindowPtr;<BR><BR> =20
}<BR> else if( =
iSlideWindowPtr>=3D-MAX_WND_SIZE )<BR> =
=20
{<BR> =
=20
pSlideWindowPtr =3D pOutputBuffer;<BR> =
=20
}<BR> =20
else<BR> =
{<BR> =20
=
pSlideWindowPtr =3D=20
NULL;<BR> =20
}<BR><BR><BR> =
for(i=3D0,=20
offset=3D0; i<OFFSET_CODING_LENGTH; i++, =
ulBitOffset++)<BR> =20
{<BR> =
=20
bit =3D =
ReadBitFromBitStream(pDataBuffer,=20
ulBitOffset);<BR> =
=20
offset |=3D (bit<<i);<BR> =
=20
}<BR><BR> =20
length=3D ReadGolombCode(&ulCodingLength, =
pDataBuffer,=20
ulBitOffset);<BR><BR> =20
assert(offset<MAX_WND_SIZE);<BR><BR> =
=20
if( length>MAX_WND_SIZE )<BR> =
=20
{<BR> =
=20
=
assert(length<=3DMAX_WND_SIZE);<BR> =20
}<BR> =
=20
ulBitOffset +=3D ulCodingLength;<BR><BR> =
=20
RtlMoveMemory(pWrite,=20
pSlideWindowPtr+offset, length);<BR> =
=20
pWrite+=3Dlength;<BR> =
=20
iSlideWindowPtr+=3Dlength;<BR> =
=20
ulBytesDecoded+=3Dlength;<BR> =20
}<BR> else<BR> =
=20
{<BR> =
for(i=3D0, cc=3D0;=20
i<8 ; i++, ulBitOffset++)<BR> =
=20
{<BR> =20
bit =3D ReadBitFromBitStream(pDataBuffer,=20
ulBitOffset);<BR> =
=20
cc |=3D ((UCHAR)bit<<i);<BR> =
=20
}<BR><BR> =20
*pWrite++ =3D cc;<BR> =
=20
iSlideWindowPtr++;<BR> =
=20
ulBytesDecoded++;<BR> =20
}<BR><BR> }<BR><BR> =
*pulNumberOfBytes=20
=3D ulBytesDecoded;<BR>}<BR><BR>extern "C"<BR>void=20
WINAPI<BR>LZ77Compress(<BR> PUCHAR=20
__pDataBuffer,<BR> ULONG =20
__ulDataLength,<BR> PUCHAR=20
__pOutputBuffer,<BR> PULONG=20
__pulNumberOfBits<BR> );<BR><BR>extern =
"C"<BR>void=20
WINAPI<BR>LZ77Decompress(<BR> PUCHAR=20
__pDataBuffer,<BR> ULONG =20
__ulNumberOfBits,<BR> PUCHAR=20
__pOutputBuffer,<BR> PULONG=20
__pulNumberOfBytes<BR> =20
);<BR><BR>int<BR>main(<BR> int =
=20
argc,<BR> char *argv[]<BR> =20
)<BR>{<BR> FILE =
*fp=3DNULL;<BR> =20
FILE *fp1;<BR> ULONG =20
fsize;<BR> ULONG =
ulNumberOfBits;<BR> =20
ULONG ulFileCompressedSize;<BR> =
ULONG=20
ulFileDecompressedSize;<BR> SYSTEMTIME =
=20
t1, t2;<BR><BR> if( 3!=3Dargc =
)<BR> =20
{<BR> printf("Usage: lz77 =
[/c | /d]=20
filename\n");<BR> return =
-1;<BR> =20
}<BR><BR><BR><BR>// char =20
s1[]=3D"abcdabcdefgabcdefaffasda";<BR>// ULONG =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -