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

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

?? lz77.cpp

?? 在Lz77的基礎上修改
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//////////////////////////////
// LZ77.CPP
//////////////////////////////

#include <windows.h>
#include <stdio.h>
#include <memory.h>
#include <crtdbg.h>

#include "lz77.h"

/////////////////////////////////////////////////////////
// 取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;
}
// UpperLog2
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
// 取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;
}
// LowerLog2
/////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////
// 得到字節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;
}
// GetBit
/////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////
// 設置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));
}
// SetBit
//////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////
// 將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;
}
// InvertDWord
//////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////
// 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++;
	}	
}
// CopyBits
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
// CopyBitsInAByte : 在一個字節范圍內復制位流
// 參數含義同 CopyBits 的參數
// 說明:
//		此函數由 CopyBits 調用,不做錯誤檢查,即
//		假定要復制的位都在一個字節范圍內
void CCompress::CopyBitsInAByte(BYTE* memDest, int nDestPos, 
			  BYTE* memSrc, int nSrcPos, int nBits)
{
	BYTE b1, b2;
	b1 = *memSrc;
	b1 <<= nSrcPos; b1 >>= 8 - nBits;	// 將不用復制的位清0
	b1 <<= 8 - nBits - nDestPos;		// 將源和目的字節對齊
	*memDest |= b1;		// 復制值為1的位
	b2 = 0xff; b2 <<= 8 - nDestPos;		// 將不用復制的位置1
	b1 |= b2;
	b2 = 0xff; b2 >>= nDestPos + nBits;
	b1 |= b2;
	*memDest &= b1;		// 復制值為0的位
}
// CopyBitsInAByte
/////////////////////////////////////////////////////////


//------------------------------------------------------------------


void CCompressLZ77::GetCompressFileName(char *dst, char *src)
{
	char FileName[MAX_PATH];
	ZeroMemory(FileName, MAX_PATH);
	char *p;
	memcpy(FileName, src, strlen(src));
	p = strstr(FileName, ".");
	*p = 0;
	strcpy(dst, FileName);
	strcat(dst, ".liz");
}

CCompressLZ77::CCompressLZ77()
{	
	SortHeap = new struct STIDXNODE[_MAX_WINDOW_SIZE];
}

CCompressLZ77::~CCompressLZ77()
{
	delete[] SortHeap;
}

// 初始化索引表,釋放上次壓縮用的空間
void CCompressLZ77::_InitSortTable()
{
	memset(SortTable, 0, sizeof(WORD) * 65536);
	nWndSize = 0;
	HeapPos = 1;
}

// 向索引中添加一個2字節串
void CCompressLZ77::_InsertIndexItem(int off)
{
	WORD q;
	BYTE ch1, ch2;
	ch1 = pWnd[off]; ch2 = pWnd[off + 1];	
	
	if (ch1 != ch2)
	{
		// 新建節點
		q = HeapPos;
		HeapPos++;
		SortHeap[q].off = off;
		SortHeap[q].next = SortTable[ch1 * 256 + ch2];
		SortTable[ch1 * 256 + ch2] = q;
	}
	else
	{
		// 對重復2字節串
		// 因為沒有虛擬偏移也沒有刪除操作,只要比較第一個節點
		// 是否和 off 相連接即可
		q = SortTable[ch1 * 256 + ch2];
		if (q != 0 && off == SortHeap[q].off2 + 1)
		{		
			// 節點合并
			SortHeap[q].off2 = off;
		}		
		else
		{
			// 新建節點
			q = HeapPos;
			HeapPos++;
			SortHeap[q].off = off;
			SortHeap[q].off2 = off;
			SortHeap[q].next = SortTable[ch1 * 256 + ch2];
			SortTable[ch1 * 256 + ch2] = q;
		}
	}
}

//////////////////////////////////////////
// 將窗口向右滑動n個字節
void CCompressLZ77::_ScrollWindow(int n)
{	
	for (int i = 0; i < n; i++)
	{		
		nWndSize++;		
		if (nWndSize > 1)			
			_InsertIndexItem(nWndSize - 2);
	}
}

///////////////////////////////////////////////////////////
// 得到已經匹配了2個字節的窗口位置offset
// 共能匹配多少個字節
int CCompressLZ77::_GetSameLen(BYTE* src, int srclen, int nSeekStart, int offset)
{
	int i = 2; // 已經匹配了2個字節
	int maxsame = min(srclen - nSeekStart, nWndSize - offset);
	while (i < maxsame
			&& src[nSeekStart + i] == pWnd[offset + i])
		i++;
	_ASSERT(nSeekStart + i <= srclen && offset + i <= nWndSize);
	return i;
}

///////////////////////////////////////////////////////////
// 在滑動窗口中查找術語
// nSeekStart - 從何處開始匹配
// offset, len - 用于接收結果,表示在滑動窗口內的偏移和長度
// 返回值- 是否查到長度為2或2以上的匹配字節串
BOOL CCompressLZ77::_SeekPhase(BYTE* src, int srclen, int nSeekStart, int* offset, int* len)
{	
	int j, m, n;

	if (nSeekStart < srclen - 1)
	{
		BYTE ch1, ch2;
		ch1 = src[nSeekStart]; ch2 = src[nSeekStart + 1];
		WORD p;
		p = SortTable[ch1 * 256 + ch2];
		if (p != 0)
		{
			m = 2; n = SortHeap[p].off;
			while (p != 0)
			{
				j = _GetSameLen(src, srclen, 
					nSeekStart, SortHeap[p].off);
				if ( j > m )
				{ 
					m = j; 
					n = SortHeap[p].off;
				}			
				p = SortHeap[p].next;
			}	
			(*offset) = n; 
			(*len) = m;
			return TRUE;		
		}	
	}
	return FALSE;
}

////////////////////////////////////////
// 輸出壓縮碼
// code - 要輸出的數
// bits - 要輸出的位數(對isGamma=TRUE時無效)
// isGamma - 是否輸出為γ編碼
void CCompressLZ77::_OutCode(BYTE* dest, DWORD code, int bits, BOOL isGamma)
{	
	if ( isGamma )
	{
		BYTE* pb;
		DWORD out;
		// 計算輸出位數
		int GammaCode = (int)code - 1;
		int q = LowerLog2(GammaCode);
		if (q > 0)
		{
			out = 0xffff;
			pb = (BYTE*)&out;
			// 輸出q個1
			CopyBits(dest + CurByte, CurBit, 
				pb, 0, q);
			MovePos(&CurByte, &CurBit, q);
		}
		// 輸出一個0
		out = 0;
		pb = (BYTE*)&out;		
		CopyBits(dest + CurByte, CurBit, pb + 3, 7, 1);
		MovePos(&CurByte, &CurBit, 1);
		if (q > 0)
		{
			// 輸出余數, q位
			int sh = 1;
			sh <<= q;
			out = GammaCode - sh;
			pb = (BYTE*)&out;
			InvertDWord(&out);
			CopyBits(dest + CurByte, CurBit, 
				pb + (32 - q) / 8, (32 - q) % 8, q);
			MovePos(&CurByte, &CurBit, q);
		}
	}
	else 
	{
		DWORD dw = (DWORD)code;
		BYTE* pb = (BYTE*)&dw;
		InvertDWord(&dw);
		CopyBits(dest + CurByte, CurBit, 
				pb + (32 - bits) / 8, (32 - bits) % 8, bits);
		MovePos(&CurByte, &CurBit, bits);
	}
}

bool CCompressLZ77::CompressFile(char* unZipFile, char* zipFile)
{
	WORD flag1, flag2;
	BYTE soubuf[65536];
	BYTE destbuf[65536 + 16];
	FILE* in = fopen(unZipFile, "rb");
	FILE* out = out = fopen(zipFile, "wb");
	if (out == NULL)
	{
		fclose(in);
		return false;
	}
	fseek(in, 0, SEEK_END);
	long soulen = ftell(in);
	fseek(in, 0, SEEK_SET);
	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 = 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);				
		}
	}
	fclose(in);
	fclose(out);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级日韩不卡播放免费| 亚洲综合自拍偷拍| 亚洲欧美日韩国产另类专区| 日韩国产高清影视| 91在线porny国产在线看| 9191成人精品久久| 亚洲精品你懂的| 成人亚洲精品久久久久软件| 日韩亚洲欧美中文三级| 亚洲愉拍自拍另类高清精品| 国产一区二区三区在线观看精品| 欧美日韩一区三区| 亚洲色图在线看| 成人精品电影在线观看| 欧美v国产在线一区二区三区| 一区二区三区日韩| 成人毛片视频在线观看| 精品国产91乱码一区二区三区| 一区二区三区四区高清精品免费观看| 丁香桃色午夜亚洲一区二区三区| 777欧美精品| 丝袜诱惑亚洲看片| 欧美日韩精品三区| 亚洲一区二区视频| 91激情五月电影| 亚洲天堂2014| 91麻豆免费视频| 亚洲视频一区在线观看| a4yy欧美一区二区三区| 国产精品久久久久久久久久久免费看 | 日本韩国一区二区三区| 亚洲国产精品成人久久综合一区| 国产一区二区在线电影| 久久午夜电影网| 国产精品主播直播| 国产三级一区二区| 丁香桃色午夜亚洲一区二区三区| 国产女同互慰高潮91漫画| 国产精品1区2区| 国产精品你懂的在线欣赏| 国产91在线|亚洲| 自拍偷自拍亚洲精品播放| 99国产精品久| 亚洲一区二区三区免费视频| 欧美中文字幕不卡| 日韩和欧美一区二区| 欧美一区二区精美| 国产一区二区三区四区五区入口| 国产视频一区二区在线观看| 成人动漫在线一区| 亚洲综合久久久| 欧美丰满少妇xxxxx高潮对白| 日本成人在线一区| 久久久久久9999| av激情综合网| 午夜av电影一区| 精品欧美乱码久久久久久1区2区| 黄色精品一二区| 国产精品二三区| 欧美精品在线一区二区三区| 麻豆免费看一区二区三区| 国产日韩欧美激情| 在线观看亚洲成人| 蜜桃视频免费观看一区| 国产午夜精品久久久久久免费视| 色诱视频网站一区| 免费三级欧美电影| 国产精品久久久久精k8| 欧美日韩一级视频| 国产激情一区二区三区| 亚洲一区二区三区四区在线观看| 欧美一二区视频| 成人免费av网站| 美女国产一区二区三区| 中文字幕乱码久久午夜不卡| 欧美日韩一区在线| 国产91在线观看| 免费一级片91| 依依成人综合视频| 久久日韩精品一区二区五区| 色香蕉久久蜜桃| 国产一区在线精品| 午夜a成v人精品| 亚洲女与黑人做爰| 国产网红主播福利一区二区| 欧美人xxxx| 91蜜桃传媒精品久久久一区二区| 久久99国产精品免费| 亚洲午夜国产一区99re久久| 中文字幕av一区 二区| 日韩午夜在线影院| 欧美精品 日韩| 一本一道久久a久久精品综合蜜臀| 久久成人麻豆午夜电影| 亚洲国产aⅴ成人精品无吗| 国产精品久久久久久一区二区三区 | 欧美高清在线一区二区| 制服丝袜中文字幕一区| 91视频xxxx| 成人黄色片在线观看| 久久疯狂做爰流白浆xx| 午夜欧美一区二区三区在线播放| 亚洲天堂成人在线观看| 欧美国产激情二区三区| 国产性做久久久久久| 久久亚洲精华国产精华液 | 奇米综合一区二区三区精品视频| 亚洲人成精品久久久久久| 日本一区二区视频在线| 国产偷国产偷亚洲高清人白洁| 91精品国产麻豆国产自产在线 | 国产精品一区二区久久精品爱涩| 日日摸夜夜添夜夜添国产精品| 一区二区三区日韩| 亚洲美女淫视频| 亚洲男人的天堂在线观看| 亚洲欧美一区二区三区国产精品 | 在线播放日韩导航| 欧美三区免费完整视频在线观看| 色哟哟一区二区| 在线视频你懂得一区| 欧美丝袜丝nylons| 欧美日韩一区精品| 欧美一区二区大片| 26uuu欧美| 国产偷v国产偷v亚洲高清| 中文欧美字幕免费| 国产精品精品国产色婷婷| 亚洲视频一区二区免费在线观看| 亚洲欧美日韩国产一区二区三区| 亚洲精品中文在线影院| 五月激情综合网| 乱一区二区av| 国产.欧美.日韩| 在线精品亚洲一区二区不卡| 欧美日韩视频在线观看一区二区三区| 欧美亚洲综合另类| 精品少妇一区二区三区免费观看| 国产亚洲1区2区3区| 亚洲免费成人av| 日韩av午夜在线观看| 丁香婷婷深情五月亚洲| 欧美亚洲愉拍一区二区| 欧美一级免费大片| 中文无字幕一区二区三区| 亚洲欧美另类在线| 蜜臀久久99精品久久久久久9| 国产乱妇无码大片在线观看| 成人激情小说乱人伦| 欧美亚洲国产怡红院影院| 欧美一区二区三区免费视频| 国产欧美一区二区精品秋霞影院| 综合av第一页| 蜜桃传媒麻豆第一区在线观看| 国产成人免费视频网站| 日本高清不卡视频| 亚洲精品一区在线观看| 亚洲精品成人悠悠色影视| 日本视频中文字幕一区二区三区| 国产精品亚洲专一区二区三区| 一本久久综合亚洲鲁鲁五月天| 欧美女孩性生活视频| 国产精品色眯眯| 日本在线播放一区二区三区| 成人免费高清在线| 精品捆绑美女sm三区| 一区二区三区蜜桃| 粉嫩绯色av一区二区在线观看| 欧美日韩国产免费| 中文字幕亚洲成人| 久久99国产精品免费| 欧美日韩国产精选| 亚洲蜜臀av乱码久久精品蜜桃| 精品一区二区免费视频| 欧美午夜寂寞影院| 国产精品国产精品国产专区不蜜| 久草这里只有精品视频| 欧美亚洲综合网| 亚洲欧美日韩中文字幕一区二区三区 | 国产成人精品免费网站| 91麻豆精品91久久久久久清纯| 亚洲乱码国产乱码精品精的特点| 国产在线精品国自产拍免费| 欧美精品久久久久久久多人混战| 亚洲欧美色一区| eeuss国产一区二区三区| 久久婷婷成人综合色| 日韩成人一级片| 欧美浪妇xxxx高跟鞋交| 一区二区三区不卡在线观看| www.日韩精品| 国产精品免费视频网站| 国产在线观看一区二区| 欧美tk—视频vk| 久久不见久久见免费视频7| 欧美日韩精品久久久| 亚洲不卡在线观看| 精品视频在线免费| 一区二区三区在线不卡| 91久久国产最好的精华液|