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

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

?? lz.cpp

?? LZ77壓縮算法是一種無損數據壓縮算法。該算法是大多數 LZ 算法變體如 LZW、LZSS 以及其它一些壓縮算法的基礎。是基于字典的編碼器。
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// lz.cpp : Defines the entry point for the console application.
//


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

#ifndef _WIX_LZ77_COMPRESS_HEADER_001_
#define _WIX_LZ77_COMPRESS_HEADER_001_
#endif

// 滑動窗口的字節大小
#define _MAX_WINDOW_SIZE	65536

// 對滑動窗口中每一個2字節串排序
// 排序是為了進行快速術語匹配
// 排序的方法是用一個64k大小的指針數組
// 數組下標依次對應每一個2字節串:(00 00) (00 01) ... (01 00) (01 01) ...
// 每一個指針指向一個鏈表,鏈表中的節點為該2字節串的每一個出現位置
struct STIDXNODE
{
	WORD off;		// 在src中的偏移
	WORD off2;		// 用于對應的2字節串為重復字節的節點
					// 指從 off 到 off2 都對應了該2字節串
	WORD next;		// 在SortHeap中的指針
};

BYTE* pWnd;
// 窗口大小最大為 64k ,并且不做滑動
// 每次最多只壓縮 64k 數據,這樣可以方便從文件中間開始解壓
// 當前窗口的長度
int nWndSize;

	
WORD SortTable[65536];  // 256 * 256 指向SortHeap中下標的指針

// 因為窗口不滑動,沒有刪除節點的操作,所以
// 節點可以在SortHeap 中連續分配
struct STIDXNODE* SortHeap;
int HeapPos;	// 當前分配位置

	// 當前輸出位置(字節偏移及位偏移)
int CurByte, CurBit;

int compress(BYTE* src, int srclen, BYTE* dest);
BOOL decompress(BYTE* src, int srclen, BYTE* dest);

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

	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 0;
	}
	//打開目標文件
	out = fopen(argv[3], "wb");
	if (out == NULL)
	{
		puts("Can't open dest file");
		fclose(in);
		return 0;
	}
	fseek(in, 0, SEEK_END);
	long soulen = ftell(in);
	fseek(in, 0, SEEK_SET);

	SortHeap = new struct STIDXNODE[_MAX_WINDOW_SIZE];


	WORD flag1, flag2;
	
	if (argv[1][0] == 'c') // 對源文件進行壓縮
	{
		int last = soulen, act;
		while ( last > 0 )
		{
			act = min(65536, last);
			fread(soubuf, act, 1, in);
			last -= act;
			if (act == 65536)			// 超過65536字節
				flag1 = 0;		
			else					
				flag1 = act;
			fwrite(&flag1, sizeof(WORD), 1, out);

			int destlen = compress((BYTE*)soubuf, act, (BYTE*)destbuf);
			if (destlen == 0)		// 不能壓縮塊
			{
				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') // 解壓縮源文件
	{
		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 (!decompress((BYTE*)soubuf, act, (BYTE*)destbuf))
				{
					puts("Decompress error");
					fclose(in);
					fclose(out);
					return 0;
				}
			}
			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);
	return 0;
}

/////////////////////////////////////////////////////////
// 取log2(n)的upper_bound
int 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 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 MovePos(int* piByte, int* piBit, int num)
{
	num += (*piBit);
	(*piByte) += num / 8;
	(*piBit) = num % 8;
}
// MovePos
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
// 得到字節byte第pos位的值
//		pos順序為高位起從0記數(左起)
BYTE 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 SetBit(BYTE* byte, int iBit, BYTE aBit)
{
	if (aBit)
		(*byte) |= (1 << (7 - iBit));
	else
		(*byte) &= ~(1 << (7 - iBit));
}
// SetBit
//////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////
// 將DWORD值從高位字節到低位字節排列
void 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
//////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
// CopyBitsInAByte : 在一個字節范圍內復制位流
// 參數含義同 CopyBits 的參數
// 說明:
//		此函數由 CopyBits 調用,不做錯誤檢查,即
//		假定要復制的位都在一個字節范圍內
void 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
/////////////////////////////////////////////////////////


////////////////////////////////////////////////////////
// CopyBits : 復制內存中的位流
//		memDest - 目標數據區
//		nDestPos - 目標數據區第一個字節中的起始位
//		memSrc - 源數據區
//		nSrcPos - 源數據區第一個字節的中起始位
//		nBits - 要復制的位數
//	說明:
//		起始位的表示約定為從字節的高位至低位(由左至右)
//		依次為 0,1,... , 7
//		要復制的兩塊數據區不能有重合
void 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);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区欧美激情| 亚洲精品一区二区三区在线观看 | 久久99精品久久久久婷婷| 欧美区一区二区三区| 亚洲国产cao| 在线播放视频一区| 日本特黄久久久高潮| 欧美一区二区三区白人| 久久成人久久爱| 久久精品男人天堂av| hitomi一区二区三区精品| 亚洲黄色片在线观看| 欧美久久久久久久久久| 美女mm1313爽爽久久久蜜臀| 国产无一区二区| 91麻豆免费观看| 日韩制服丝袜先锋影音| 精品久久国产老人久久综合| 国产精选一区二区三区| 成人免费在线视频| 欧美久久久久中文字幕| 国产成人综合网| 一级特黄大欧美久久久| 91精品欧美综合在线观看最新| 蜜桃一区二区三区四区| 国产精品久久影院| 欧美日韩精品是欧美日韩精品| 日韩av电影一区| 国产精品日韩成人| 91麻豆精品国产| 成人精品免费看| 午夜一区二区三区视频| 久久久www免费人成精品| 91精品福利在线| 国产精品影视在线| 亚洲国产精品久久人人爱| 精品国产乱码久久久久久1区2区 | 亚洲午夜精品17c| 精品毛片乱码1区2区3区 | 精品一区二区三区视频在线观看| 欧美极品aⅴ影院| 91精品欧美福利在线观看| 国产xxx精品视频大全| 亚洲一区二区在线播放相泽| 久久久蜜臀国产一区二区| 欧美视频第二页| 99久久久精品| 国产成人丝袜美腿| 琪琪一区二区三区| 亚洲综合色自拍一区| 日本一区二区三区国色天香| 日韩一区二区视频| 欧美四级电影网| 91小视频在线观看| 国产高清成人在线| 久99久精品视频免费观看| 亚洲一区二区三区爽爽爽爽爽| 国产精品日韩成人| 久久精品一区二区| 日韩一区二区精品葵司在线| 色婷婷综合久久| 91免费视频网址| 国产91精品免费| 国产精品一二三四区| 久久精品国产免费| 免费欧美在线视频| 视频一区欧美日韩| 亚洲777理论| 午夜国产精品影院在线观看| 亚洲一区二区黄色| 亚洲自拍偷拍网站| 亚洲一区在线视频观看| 亚洲黄色录像片| 亚洲免费色视频| 亚洲欧美成人一区二区三区| 国产精品福利av| 国产精品久久久久aaaa樱花| 国产精品素人一区二区| 亚洲国产精品传媒在线观看| 国产日产亚洲精品系列| 国产亚洲一区二区三区四区| 久久久不卡网国产精品二区| 久久精品人人爽人人爽| 国产亚洲一本大道中文在线| 国产色综合久久| 国产精品日日摸夜夜摸av| 最近中文字幕一区二区三区| 国产精品久久久久7777按摩| 亚洲欧美日韩国产综合| 亚洲在线中文字幕| 亚洲成va人在线观看| 日本伊人色综合网| 韩国v欧美v亚洲v日本v| 国产成人精品免费一区二区| 99麻豆久久久国产精品免费| 97精品久久久午夜一区二区三区| 色天使色偷偷av一区二区| 欧美唯美清纯偷拍| 日韩你懂的在线观看| 久久综合久久鬼色中文字| 国产欧美一区二区精品性| 国产精品日韩成人| 亚洲成人久久影院| 蜜乳av一区二区三区| 国产91在线观看| 91麻豆免费在线观看| 9191精品国产综合久久久久久| 日韩免费电影一区| 国产精品高潮呻吟久久| 五月天丁香久久| 国产精品1区二区.| 欧洲精品在线观看| 久久一区二区视频| 一区二区三区不卡视频| 精品在线一区二区三区| 国产成人综合网| 在线成人av网站| 中文字幕不卡三区| 天天爽夜夜爽夜夜爽精品视频| 极品瑜伽女神91| 色94色欧美sute亚洲线路二| 日韩欧美亚洲国产精品字幕久久久| 久久精品一区二区| 三级亚洲高清视频| 91在线码无精品| 日韩精品一区二区在线| 亚洲欧美成人一区二区三区| 精品亚洲免费视频| 欧美视频在线观看一区| 中文在线免费一区三区高中清不卡| 亚洲视频在线观看三级| 久久99精品久久只有精品| 在线观看国产精品网站| 国产欧美va欧美不卡在线| 图片区小说区区亚洲影院| 成人爱爱电影网址| 精品国产亚洲一区二区三区在线观看| 欧美韩国一区二区| 精东粉嫩av免费一区二区三区| 欧美日韩三级一区| 日韩美女精品在线| 国产精品系列在线观看| 欧美一区二区三区婷婷月色| 综合久久国产九一剧情麻豆| 国产尤物一区二区在线| 91精品国产入口在线| 亚洲在线视频网站| 99精品欧美一区二区三区小说| 日韩视频一区二区三区| 午夜精品免费在线观看| 欧洲一区在线观看| 亚洲日本在线视频观看| 国产91精品一区二区麻豆网站| 精品国产99国产精品| 日韩精品久久理论片| 欧美三片在线视频观看| 亚洲激情av在线| 一本到不卡免费一区二区| 中文字幕 久热精品 视频在线 | 国产精品区一区二区三| 激情综合五月天| 欧美成人一级视频| 久久国产夜色精品鲁鲁99| 日韩一级片网站| 男男gaygay亚洲| 日韩一级二级三级| 久久精品国产一区二区| 日韩欧美中文字幕精品| 蜜桃一区二区三区在线观看| 欧美一区二区三级| 蜜桃视频一区二区| 亚洲精品一区二区三区香蕉| 国产一区二区三区四区在线观看 | 欧美性视频一区二区三区| 日韩理论在线观看| 色噜噜偷拍精品综合在线| 亚洲精品中文在线影院| 在线免费观看日韩欧美| 一级日本不卡的影视| 欧美日韩mp4| 蜜桃免费网站一区二区三区| 精品欧美一区二区三区精品久久| 精品一区二区免费看| 亚洲国产精品v| caoporn国产精品| 亚洲综合图片区| 日韩精品一区国产麻豆| 国产福利不卡视频| 亚洲精品国产一区二区三区四区在线| 色94色欧美sute亚洲线路一ni | 天天做天天摸天天爽国产一区| 欧美一区二区三区在线电影| 国内精品免费**视频| 国产农村妇女毛片精品久久麻豆 | 欧美大片一区二区| 国产成人av网站| 一区二区三区四区国产精品| 欧美精品高清视频| 国产在线一区二区综合免费视频| 日本一二三不卡|