lz77.cpp

来自「几种常用的压缩算法 本程序包含以下功能: 1、 Arithmetic cod」· C++ 代码 · 共 165 行

CPP
165
字号
// Implementation of pure LZ77 looseless compression.// Modification of this algorithm was used for NTFS compression.//// Implemented by Arkadi Kagan.//#include "LZ77.h"#define	BITS_LEN	4CLZ77::CLZ77(){}CLZ77::~CLZ77(){}long CLZ77::LZComp(BYTE *s1, BYTE *s2, long maxlen){	long i;	for (i = 0; i < maxlen; i++)		if (s1[i] != s2[i])			return i;		return maxlen;}BYTE *CLZ77::FindLZ(BYTE *source, BYTE *s, long slen, long border, long mlen, long &len){	register long maxlen = 0;	register long limit = slen - (s-source);	BYTE *maxp = s-1;	BYTE *p;	len = 0;	for (p = s-1; p >= source; p--)	{		len = LZComp(p, s, limit);		if (len > maxlen)		{			maxp = p;			maxlen = len;		}		if (s-p >= border-1) break;		if (len >= mlen-1) break;	}	len = min(maxlen, mlen-1);	return maxp;}long CLZ77::GetMaxEncoded(long len){	return len + sizeof(DWORD);}long CLZ77::GetMaxDecoded(BYTE *source){	return ((DWORD*)source)[0];}void CLZ77::Encode(BYTE *target, long &tlen, BYTE *source, long slen){	long len, block;	long shift, border;	BYTE *s, *t, *p;	BYTE *flag;	WORD *ptmp;		((DWORD*)target)[0] = slen;		// save source size	target += sizeof(DWORD);	tlen = sizeof(DWORD);		block = 0;				// block - bit in single flag byte	shift = 16;				// shift offset to most significant bits	border = 1;				// offset can`t be more then border	flag = target;			// flag for every 8 entities	tlen++;					// byte for first flag	*flag = 0;	s = source;	t = target + 1;	for (s = source; s-source < slen; )	{		if (shift > BITS_LEN)			while (s-source >= border)			{				if (shift <= BITS_LEN) break;				border = border << 1;				shift--;			}			p = FindLZ(source, s, slen, border, (1<<shift), len);			if (len <= 2) len = 1;			if (len <= 1)			{				*t++ = *s++;				tlen++;			} else			{				ptmp = (WORD*)t;				*ptmp = (WORD)(((s-p-1)<<shift) + len);								*flag |= 1<<block;				t += 2;				tlen += 2;				s += len;			}			if (++block >= 8)			{				flag = t++;				*flag = 0;				block = 0;				tlen++;			}			if (tlen >= slen)			{				tlen = 0;				return;			}			OnStep();	}}long CLZ77::Decode(BYTE *target, long &tlen, BYTE *source, long slen){	long i;	long block, len;	long shift, border;	BYTE *s, *t, *p;	BYTE *flag;	WORD *ptmp;		tlen = ((DWORD*)source)[0];	source += sizeof(DWORD);			// read/remove target size	slen -= sizeof(DWORD);		t = target;	flag = source;	block = 0;				// block - bit in single flag byte	shift = 16;				// shift offset to most significant bits	border = 1;				// offset can`t be more then border	for (s = source+1; (s < source+slen) && (t-target < tlen); )	{		if (shift > BITS_LEN)			while (t-target >= border)			{				if (shift <= BITS_LEN) break;				border = border << 1;				shift--;			}			if (flag[0]&(1<<block))			{				ptmp = (WORD*)s;				len = ((1<<shift)-1)&ptmp[0];				p = t - (ptmp[0]>>shift) - 1;				for (i = 0; i < len; i++)					t[i] = p[i];				t += len;				s += 2;			} else			{				*t++ = *s++;				len = 1;			}			if (++block >= 8)			{				flag = s++;				block = 0;			}			OnStep();	}	return (s-source) + sizeof(DWORD);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?