亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lz77.cpp

?? LZ77壓縮算法的VC++實現。多媒體課程設計
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include <windows.h>
#include <stdio.h>
#include <memory.h>
#include <crtdbg.h>

#define _MAX_WINDOW_SIZE	65536

class CCompress
{
public:
	CCompress() {};
	virtual ~CCompress() {};

public:
	virtual int Compress(BYTE* src, int srclen, BYTE* dest) = 0;
	virtual BOOL Decompress(BYTE* src, int srclen, BYTE* dest) = 0;

protected:

	void CopyBitsInAByte(BYTE* memDest, int nDestPos, BYTE* memSrc, int nSrcPos, int nBits);
	// 在一個字節范圍內復制位流
	void CopyBits(BYTE* memDest, int nDestPos, BYTE* memSrc, int nSrcPos, int nBits);
	//復制內存中的位流
	void InvertDWord(DWORD* pDW);	// 將DWORD值從高位字節到低位字節排列
	void SetBit(BYTE* byte, int iBit, BYTE aBit); // 設置byte的第iBit位為aBit
	BYTE GetBit(BYTE byte, int pos); 	// 得到字節byte第pos位的值
	void MovePos(int* piByte, int* piBit, int num);	
	// 將位指針*piByte(字節偏移), *piBit(字節內位偏移)后移num
	int UpperLog2(int n);	// 取log2(n)的upper_bound
	int LowerLog2(int n);	// 取log2(n)的upper_bound
};

class CCompressLZ77 : public CCompress
{
public:
	CCompressLZ77();
	virtual ~CCompressLZ77();
public:

	int Compress(BYTE* src, int srclen, BYTE* dest);	// 壓縮一段字節流	
	BOOL Decompress(BYTE* src, int srclen, BYTE* dest);// 解壓縮一段字節流

protected:

	BYTE* pWnd;
	int nWndSize;   // 當前窗口的長度
	struct STIDXNODE
	{
		WORD off;		// 在src中的偏移
		WORD off2;		// 用于對應的2字節串為重復字節的節點
						// 指從 off 到 off2 都對應了該2字節串
		WORD next;		// 在SortHeap中的指針
	};	
	WORD SortTable[65536];  // 256 * 256 指向SortHeap中下標的指針
	struct STIDXNODE* SortHeap;
	int HeapPos;  // 當前分配位置
	int CurByte, CurBit;

protected:

	void _OutCode(BYTE* dest, DWORD code, int bits, BOOL isGamma);	// 輸出壓縮碼
	BOOL _SeekPhase(BYTE* src, int srclen, int nSeekStart, int* offset, int* len);
	// 在滑動窗口中查找術語
	inline int _GetSameLen(BYTE* src, int srclen, int nSeekStart, int offset);
	// 得到已經匹配了3個字節的窗口位置offset
	inline void _ScrollWindow(int n);
	inline void _InsertIndexItem(int off);// 向索引中添加一個2字節串
	void _InitSortTable();// 初始化索引表,釋放上次壓縮用的空間

};

/**************************************************************************/

void main(int argc, char* argv[])
{	
	if (argc != 4)
	{
		printf("%d  ",argc);
		puts("Usage: ");
		printf("    Compress : %s c sourcefile destfile\n", argv[0]);
		printf("  Decompress : %s d sourcefile destfile\n", argv[0]);
		return;
	}

	BYTE soubuf[65536];
	BYTE destbuf[65536 + 16];

	FILE* in;
	FILE* out;
	in = fopen(argv[2], "rb");
	if (in == NULL)
	{
		puts("Can't open source file");
		return;
	}
	out = fopen(argv[3], "wb");
	if (out == NULL)
	{
		puts("Can't open dest file");
		fclose(in);
		return;
	}
	fseek(in, 0, SEEK_END);
	long soulen = ftell(in);
	fseek(in, 0, SEEK_SET);

	CCompressLZ77 cc;
	WORD flag1, flag2;
	
	if (argv[1][0] == 'c') // compress
	{
		int last = soulen, act;
		while ( last > 0 )
		{
			act = min(65536, last);
			fread(soubuf, act, 1, in);
			last -= act;
			if (act == 65536)			// out 65536 bytes				
				flag1 = 0;		
			else					// out last blocks
				flag1 = act;
			fwrite(&flag1, sizeof(WORD), 1, out);

			int destlen = cc.Compress((BYTE*)soubuf, act, (BYTE*)destbuf);
			if (destlen == 0)		// can't compress the block
			{
				flag2 = flag1;
				fwrite(&flag2, sizeof(WORD), 1, out);
				fwrite(soubuf, act, 1, out);
			}
			else
			{
				flag2 = (WORD)destlen;
				fwrite(&flag2, sizeof(WORD), 1, out);				
				fwrite(destbuf, destlen, 1, out);				
			}
		}
	}
	else if (argv[1][0] == 'd') // decompress
	{
		int last = soulen, act;
		while (last > 0)
		{
			fread(&flag1, sizeof(WORD), 1, in);
			fread(&flag2, sizeof(WORD), 1, in);
			last -= 2 * sizeof(WORD);
			if (flag1 == 0)
				act = 65536;
			else
				act = flag1;
			last-= flag2 ? (flag2) : act;

			if (flag2 == flag1)
			{
				fread(soubuf, act, 1, in);				
			}
			else
			{
				fread(destbuf, flag2, 1, in);
				if (!cc.Decompress((BYTE*)soubuf, act, (BYTE*)destbuf))
				{
					puts("Decompress error");
					fclose(in);
					fclose(out);
					return;
				}
			}
			fwrite((BYTE*)soubuf, act, 1, out);				
		}
	}
	else
	{
		puts("Usage: ");
		printf("    Compress : %s c sourcefile destfile\n", argv[0]);
		printf("  Decompress : %s d sourcefile destfile\n", argv[0]);		
	}

	fclose(in);
	fclose(out);
}

/********************************************************************/

// 取log2(n)的upper_bound
int CCompress::UpperLog2(int n)
{
	int i = 0;
	if (n > 0)
	{
		int m = 1;
		while(1)
		{
			if (m >= n)
				return i;
			m <<= 1;
			i++;
		}
	}
	else 
		return -1;
}


// 取log2(n)的lower_bound
int CCompress::LowerLog2(int n)
{
	int i = 0;
	if (n > 0)
	{
		int m = 1;
		while(1)
		{
			if (m == n)
				return i;
			if (m > n)
				return i - 1;
			m <<= 1;
			i++;
		}
	}
	else 
		return -1;
}

// 將位指針*piByte(字節偏移), *piBit(字節內位偏移)后移num位
void CCompress::MovePos(int* piByte, int* piBit, int num)
{
	num += (*piBit);
	(*piByte) += num / 8;
	(*piBit) = num % 8;
}

// 得到字節byte第pos位的值
//		pos順序為高位起從0記數(左起)
BYTE CCompress::GetBit(BYTE byte, int pos)
{
	int j = 1;
	j <<= 7 - pos;
	if (byte & j)
		return 1;
	else 
		return 0;
}

// 設置byte的第iBit位為aBit
//		iBit順序為高位起從0記數(左起)
void CCompress::SetBit(BYTE* byte, int iBit, BYTE aBit)
{
	if (aBit)
		(*byte) |= (1 << (7 - iBit));
	else
		(*byte) &= ~(1 << (7 - iBit));
}

// 將DWORD值從高位字節到低位字節排列
void CCompress::InvertDWord(DWORD* pDW)
{
	union UDWORD{ DWORD dw; BYTE b[4]; };
	UDWORD* pUDW = (UDWORD*)pDW;
	BYTE b;
	b = pUDW->b[0];	pUDW->b[0] = pUDW->b[3]; pUDW->b[3] = b;
	b = pUDW->b[1];	pUDW->b[1] = pUDW->b[2]; pUDW->b[2] = b;
}

// CopyBits : 復制內存中的位流
//		memDest - 目標數據區
//		nDestPos - 目標數據區第一個字節中的起始位
//		memSrc - 源數據區
//		nSrcPos - 源數據區第一個字節的中起始位
//		nBits - 要復制的位數
//	說明:
//		起始位的表示約定為從字節的高位至低位(由左至右)
//		依次為 0,1,... , 7
//		要復制的兩塊數據區不能有重合
void CCompress::CopyBits(BYTE* memDest, int nDestPos, 
			  BYTE* memSrc, int nSrcPos, int nBits)
{
	int iByteDest = 0, iBitDest;
	int iByteSrc = 0, iBitSrc = nSrcPos;

	int nBitsToFill, nBitsCanFill;

	while (nBits > 0)
	{
		// 計算要在目標區當前字節填充的位數
		nBitsToFill = min(nBits, iByteDest ? 8 : 8 - nDestPos);
		// 目標區當前字節要填充的起始位
		iBitDest = iByteDest ? 0 : nDestPos;
		// 計算可以一次從源數據區中復制的位數
		nBitsCanFill = min(nBitsToFill, 8 - iBitSrc);
		// 字節內復制
		CopyBitsInAByte(memDest + iByteDest, iBitDest, 
			memSrc + iByteSrc, iBitSrc, nBitsCanFill);		
		// 如果還沒有復制完 nBitsToFill 個
		if (nBitsToFill > nBitsCanFill)
		{
			iByteSrc++; iBitSrc = 0; iBitDest += nBitsCanFill;
			CopyBitsInAByte(memDest + iByteDest, iBitDest, 
					memSrc + iByteSrc, iBitSrc, 
					nBitsToFill - nBitsCanFill);
			iBitSrc += nBitsToFill - nBitsCanFill;
		}
		else 
		{
			iBitSrc += nBitsCanFill;
			if (iBitSrc >= 8)
			{
				iByteSrc++; iBitSrc = 0;
			}
		}

		nBits -= nBitsToFill;	// 已經填充了nBitsToFill位
		iByteDest++;
	}	
}

// CopyBitsInAByte : 在一個字節范圍內復制位流
// 參數含義同 CopyBits 的參數
// 說明:
//		此函數由 CopyBits 調用,不做錯誤檢查,即
//		假定要復制的位都在一個字節范圍內
void CCompress::CopyBitsInAByte(BYTE* memDest, int nDestPos, 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电影免费观看高清完整版 | 日韩欧美一级特黄在线播放| 麻豆成人久久精品二区三区小说| 国产精品久久久久精k8 | 欧美在线观看视频一区二区 | 欧美制服丝袜第一页| 韩国午夜理伦三级不卡影院| 一区二区三区精品视频| 精品人在线二区三区| 欧美日韩精品是欧美日韩精品| 成人一区二区三区| 美女网站一区二区| 亚洲资源中文字幕| 国产精品嫩草99a| wwwwxxxxx欧美| 91精品国产欧美一区二区成人| 99精品国产一区二区三区不卡| 狠狠色丁香婷婷综合| 午夜精品久久久久久久久久| 亚洲美女视频一区| 国产日产欧产精品推荐色| 欧美一区在线视频| 欧美三级电影在线看| 97久久久精品综合88久久| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美精品在欧美一区二区少妇| jiyouzz国产精品久久| 国产专区综合网| 国产在线精品国自产拍免费| 日韩1区2区日韩1区2区| 五月天丁香久久| 亚洲大片精品永久免费| 夜夜精品浪潮av一区二区三区 | 久久超碰97人人做人人爱| 午夜视频一区二区| 午夜精品福利在线| 亚洲综合丝袜美腿| 亚洲精品你懂的| 亚洲精品国久久99热| 亚洲人成网站影音先锋播放| 国产精品国产三级国产普通话99 | 欧美美女直播网站| 欧美视频中文字幕| 欧洲另类一二三四区| 日本高清成人免费播放| 欧美三级在线播放| 欧美日韩亚洲国产综合| 欧美一级日韩一级| 欧美一区二区女人| 精品国产凹凸成av人导航| 亚洲精品在线三区| 国产亚洲欧美中文| 国产精品人成在线观看免费| 国产精品久久久久久妇女6080 | 在线视频一区二区三| 在线观看亚洲a| 欧美三级视频在线| 日韩一区二区三区视频在线| 精品国产三级a在线观看| 久久综合五月天婷婷伊人| 久久久久一区二区三区四区| 中文字幕高清不卡| 亚洲靠逼com| 天天操天天色综合| 久久99精品久久只有精品| 国产在线视频一区二区三区| 国产精品99久久久久久有的能看| 国产成人自拍高清视频在线免费播放| 成+人+亚洲+综合天堂| 91黄色激情网站| 五月激情综合网| 激情小说亚洲一区| 成人国产一区二区三区精品| 在线中文字幕一区| 日韩午夜在线影院| 国产精品污www在线观看| 亚洲综合一区二区精品导航| 喷白浆一区二区| aaa亚洲精品| 欧美蜜桃一区二区三区| 久久蜜桃av一区精品变态类天堂| 亚洲日本电影在线| 日韩国产在线一| jlzzjlzz欧美大全| 日韩一区二区三区在线视频| 国产精品电影一区二区| 婷婷一区二区三区| 丰满亚洲少妇av| 欧美一区二区三区在| 日本一区二区不卡视频| 午夜一区二区三区在线观看| 国产成人小视频| 欧美猛男gaygay网站| 国产精品乱码一区二区三区软件 | 亚洲欧洲精品天堂一级| 天天色天天操综合| 波多野结衣亚洲一区| 91麻豆精品国产91久久久使用方法| 国产日韩视频一区二区三区| 亚洲gay无套男同| 成人高清免费观看| 日韩一区二区中文字幕| 樱花草国产18久久久久| 国产精品99久久久久久久女警 | 一级女性全黄久久生活片免费| 国产精品18久久久久| 欧美日韩日日摸| 综合欧美亚洲日本| 精一区二区三区| 欧美日韩成人激情| 亚洲美女视频在线| av日韩在线网站| 国产日韩成人精品| 黄色成人免费在线| 欧美精品 日韩| 亚洲第一福利视频在线| 色综合天天综合网天天看片| 国产亲近乱来精品视频| 蜜桃一区二区三区在线| 欧美色精品在线视频| 亚洲免费观看高清完整版在线| 国产mv日韩mv欧美| 日韩欧美色综合网站| 丝袜美腿亚洲一区二区图片| 欧美日韩一区二区三区不卡| 亚洲精品高清视频在线观看| 91免费视频观看| 亚洲色大成网站www久久九九| 成人激情电影免费在线观看| 国产欧美一区二区三区在线看蜜臀| 国产一区二区电影| 久久亚区不卡日本| 国产精品一区2区| 国产网红主播福利一区二区| 国产精品综合二区| 久久久久久久久久看片| 国内不卡的二区三区中文字幕| 精品国产一二三区| 国模套图日韩精品一区二区| wwwwxxxxx欧美| 国产成人免费视频网站 | 一区二区三区免费在线观看| 91色.com| 午夜精品福利一区二区蜜股av| 欧美区视频在线观看| 午夜精品久久久久影视| 91精品一区二区三区在线观看| 欧美aaaaaa午夜精品| 日韩免费看的电影| 国产麻豆精品在线| 国产日产欧美一区| 99视频精品在线| 一区二区成人在线| 欧美日韩你懂得| 久久精品噜噜噜成人av农村| 久久精品一区二区三区av| 国产99久久久国产精品免费看 | 久久久久久久久久美女| 成人高清免费在线播放| 一区二区三区欧美激情| 欧美一区二区三区免费| 国内成+人亚洲+欧美+综合在线 | 亚洲第一主播视频| 欧美一区二区女人| 国产精品99久久久久久似苏梦涵| 国产精品不卡一区| 欧美高清视频一二三区| 国产又粗又猛又爽又黄91精品| 中文字幕一区在线| 欧美日韩美少妇| 国产又黄又大久久| 亚洲少妇30p| 日韩一区二区三区四区| 国产99久久久国产精品潘金网站| 亚洲综合999| 2020日本不卡一区二区视频| 一本色道综合亚洲| 蜜桃视频在线观看一区二区| 国产精品素人一区二区| 欧美性色黄大片手机版| 激情六月婷婷久久| 亚洲精品乱码久久久久| 日韩欧美电影在线| 99riav久久精品riav| 青青草成人在线观看| 中文字幕中文乱码欧美一区二区| 9191成人精品久久| 成人激情文学综合网| 日本aⅴ免费视频一区二区三区| 中文字幕乱码亚洲精品一区 | 欧洲一区二区av| 国产成人自拍高清视频在线免费播放| 亚洲成人在线免费| 国产精品毛片大码女人| 欧美不卡123| 欧美巨大另类极品videosbest | 成人国产在线观看| 久久精品72免费观看| 亚洲综合男人的天堂| 国产精品天天摸av网|