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

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

?? lzw.cpp

?? 該軟件用lzw算法完成對文件的壓縮和解壓縮
?? CPP
字號:
// LZW.cpp: 實現CLZW類.
//
#include "LZW.h"

//---------------------------------------------------------------------------
CLZW::CLZW()
{
	hash_code   = 0;
	hash_prefix = 0;
	hash_suffix = 0;
	symbol_head = 0;
	symbol_tail = 0;
	symbol_stack= 0;
}

//---------------------------------------------------------------------------
CLZW::~CLZW()
{
	if(hash_code)  	 free(hash_code);     
	if(hash_prefix)  free(hash_prefix);  
	if(hash_suffix)  free(hash_suffix);  
	if(symbol_head)  free(symbol_head);  
	if(symbol_tail)  free(symbol_tail);  
	if(symbol_stack) free(symbol_stack); 
}

//---------------------------------------------------------------------------
// 一個零長度的塊標志數據塊序列的結束.
int CLZW::GetDataBlock (char *buf)
{
	int count;
	if ((count = getc(infile)) != EOF)
	{
		if (count > 0) {
			if (fread(buf, 1, count,infile)!=(size_t)count) 
				return -1;
		}
	}
	
	return count;
}

//---------------------------------------------------------------------------
// 跳過一序列數據塊直到找到塊結尾. 
void  CLZW::SkipDataBlocks ()
{
	char buf[256];
	while (GetDataBlock(buf) > 0);
}

//---------------------------------------------------------------------------
// (重新)初始化LZW 狀態. 
void CLZW::ReInitLZW()
{
	n_bits = init_bits;
	maxcode = ClearCode << 1;	    // 2^code_size. 
	code_counter = ClearCode + 2; 	// 第一個未用的代碼值. 
	sp = symbol_stack;		        // 初始化堆棧使其為空.
}

//---------------------------------------------------------------------------
// 初始化,以便 LZWReadByte和GetCode的調用. 
void CLZW::InitLZWCode (FILE* file, int ibits)
{
	printf("decompress size  %d\n",ibits);
	// GetCode 初始化. 
	symbol_head  = (code_int *)malloc(LZW_TABLE_SIZE * sizeof(code_int));
	symbol_tail  = (UINT8 *) malloc(LZW_TABLE_SIZE * sizeof(UINT8));
	symbol_stack = (UINT8 *) malloc(LZW_TABLE_SIZE * sizeof(UINT8));
	infile=file;
	
	init_bits=ibits;
	
	last_byte = 2;	// 保證重新拷貝最后兩個字節.
	last_bit = 0;	// 緩沖區為空. 
	cur_bits = 0;	// 緩沖區的第一個字符.
	
	out_of_blocks = false;
	
	// LZWReadByte 初始化. 
	ClearCode = ((code_int) 1 << (init_bits-1));
	EOFCode = ClearCode + 1;	
	first_byte = true;
	ReInitLZW();
}

//---------------------------------------------------------------------------
// 從壓縮數據中提取以后的 code_size 個比特,假定code_size 小于16. 
int CLZW::GetCode ()
{
	int offs, ret, count;
	if ( (cur_bits+n_bits) > last_bit) { // 重新裝載緩沖區.
		if (out_of_blocks) {
			return EOFCode;		
		}
		// 保持最后兩個字節- 假定 code_size <= 16. 
		code_buf[0] = code_buf[last_byte-2];
		code_buf[1] = code_buf[last_byte-1];
		
		// 裝載更多的字節; 如果到達終止,設置標識.
		if ((count = GetDataBlock(&code_buf[2])) == 0) {
			out_of_blocks = true;
			return EOFCode;		
		}
		
		// 重置計數器. 
		cur_bits = (cur_bits - last_bit) + 16;
		last_byte = 2 + count;
		last_bit = last_byte * 8;
	}
	
	// 形成積累下一個24 bits的字符. 
	offs = cur_bits >> 3;	// 字節包含 cur_bit. 
	cur_accum = code_buf[offs+2] & 0xFF;
	cur_accum <<= 8;
	cur_accum |= code_buf[offs+1] & 0xFF;
	cur_accum <<= 8;
	cur_accum |= code_buf[offs] & 0xFF;
	
	// 向右積累排列cur_bit, 然后通過掩碼得到需要的bits數.
	cur_accum >>= (cur_bits & 7);
	ret = ((int) cur_accum) & ((1 << n_bits) - 1);
	cur_bits += n_bits;
	
	return ret;
}

//---------------------------------------------------------------------------
// 讀取一個 LZW 壓縮的字節.
int CLZW::LZWReadByte () 
{
	static int oldcode;	   // 前一個 LZW 符. 
	static int firstcode;  // 原碼擴展后的第一個字節.
	register int code;	   // 當前工作代碼.
	int incode;			   // 保存實際的輸入代碼.
	
	if (first_byte) {
		first_byte = false;
		code = ClearCode;	
	} else {
		
		// 如果堆棧有以前讀過的符號,返回它.
		if (sp > symbol_stack)
			return (int) *(--sp);
		
		// 讀入新的符號. 
		code = GetCode();
	}
	
	if (code == ClearCode) {
		ReInitLZW();
		do {
			code = GetCode();
		} while (code == ClearCode);
		if (code > ClearCode) {	    // 保證它是一個未壓縮的字節.
			printf("Corrupt data in LZWReadByte check 1.\n");
			code = 0;			
		}
		firstcode = oldcode = code;	// 使 firstcode, oldcode 有效. 
		return code;
	}
	
	if (code == EOFCode) {
		if (! out_of_blocks) {
			SkipDataBlocks();
			out_of_blocks = true;
		}
		
		// 沒有足夠的數據.
		printf("Premature end of file!\n");
		return 257;
	}
	
	// 得到正常未壓縮的字節或LZW 符號. 
	incode = code;		
	if (code >= code_counter) {	
		if (code > code_counter) {
			printf("Corrupt data in LZWReadByte check 2.\n");
			incode = 0;		// 以免在符號表中產生循環.
		}
		*sp++ = (UINT8) firstcode;	
		code = oldcode;
	}
	
	// 如果是一個符號, 把它擴展后放入堆棧.
	while (code >= ClearCode) {
		// 符號尾: 一個簡單的字節值. 
		*sp++ = symbol_tail[code];	
		// 符號頭: 另一個LZW 符號. 
		code = symbol_head[code];	
	}
	
	// 表示的是一個未被壓縮的字節. 
	firstcode = code;		
	
	// 判別表中是否有空間.
	if ((code = code_counter) < LZW_TABLE_SIZE) {
		// 定義一個新符號 = 原來的符號 + 這個符號擴展后的頭字節. 
		symbol_head[code] = oldcode;
		symbol_tail[code] = (UINT8) firstcode;
		code_counter++;
		
		// 增加 n_bits. 
		if ((code_counter >= maxcode) && (n_bits < MAX_LZW_BITS)) {
			n_bits++;
			// 保持等于 2^code_size. 
			maxcode <<= 1;	
		}
	}
	
	oldcode = incode;	// 保存最后的輸入符號,以便以后使用.
	return firstcode;	// 返回符號擴展后的第一個字節.
}

//---------------------------------------------------------------------------
// flush any accumulated data. 
void CLZW::flush_packet ()
{
	if (bytesinpkt > 0) {		// never write zero-length packet. 
		packetbuf[0] = (char) bytesinpkt++;
		if (fwrite(packetbuf, 1, bytesinpkt,outfile)
			!= (size_t) bytesinpkt)
			printf("Output file write error.\n");
		bytesinpkt = 0;
	}
}

//---------------------------------------------------------------------------
// 在現有的緩沖區增加一個字節,同時在有必要時向磁盤寫保存數據.
void CLZW::CHAR_OUT (int c)
{
	packetbuf[++bytesinpkt] = (char) (c);  
    if (bytesinpkt >= 255)
		flush_packet(); 
}

//---------------------------------------------------------------------------
// 發送一個n_bits比特的代碼, 
// 用 cur_accum 和 cur_bits 重新組成新的 8-bit 字節. 
void CLZW::output (code_int code)
{
	cur_accum |= ((INT32) code) << cur_bits;
	cur_bits += n_bits;
	
	while (cur_bits >= 8) {
		CHAR_OUT(cur_accum & 0xFF);
		cur_accum >>= 8;
		cur_bits -= 8;
	}
	
	//如果下一個輸入比最大的代碼大,則增加它,
	// 這樣做是為了保證與解壓時同步.
	
	if (free_code > maxcode) {
		n_bits++;
		if (n_bits == MAX_LZW_BITS)
			maxcode = LZW_TABLE_SIZE;	
		else
			maxcode = MAXCODE(n_bits);
	}
}

//---------------------------------------------------------------------------
//  清空hash表. 
void CLZW::clear_hash ()
{
	memset((void *) hash_code,0, HSIZE * sizeof(code_int));
}

//---------------------------------------------------------------------------
// 重置壓縮并發送一個清除碼.
void CLZW::clear_block ()
{
	clear_hash();			        // 刪除所有標識符. 
	free_code = ClearCode + 2;
	output(ClearCode);		        // 壓縮. 
	n_bits = init_bits;		        // 重置代碼長度. 
	maxcode = MAXCODE(n_bits);
}

//---------------------------------------------------------------------------
// 初始化LZW 壓縮.
void CLZW::compress_init (FILE* file,int ibits)
{
    printf("compress size  %d\n",ibits);
	// 初始化所有的靜態變量,給hash表分配內存. 
    hash_code = (code_int *) malloc(HSIZE * sizeof(code_int));
    hash_prefix = (code_int *) malloc(HSIZE * sizeof(code_int));
    hash_suffix = (UINT8 *) malloc(HSIZE * sizeof(UINT8));
	
    outfile=file; 
    n_bits = init_bits = ibits;
	
	maxcode = MAXCODE(n_bits);
	ClearCode = ((code_int) 1 << (init_bits - 1));
    EOFCode = ClearCode + 1;
    free_code = ClearCode + 2;
    first_byte = true;		
	
	// 初始化輸出緩沖區變量.
	bytesinpkt = 0;
    cur_accum = 0;
    cur_bits = 0;
	// 清理hash表. 
    clear_hash();
	// 給定一個初始清理字符.
    output(ClearCode);
}

//---------------------------------------------------------------------------
// 得到和壓縮一個 8-bit 字節. 
void CLZW::compress_byte (int c)
{
	register hash_int i;
	register hash_int disp;
	
	if (first_byte) {		// 需要初始化一個等待碼. 
		waiting_code = c;
		first_byte = false;
		return;
	}
	
	i = ((hash_int) c << (MAX_LZW_BITS-8)) + waiting_code;
	// i 小于兩倍的 2**MAX_LZW_BITS, 因此 小于兩倍的HSIZE. 
	if (i >= HSIZE)
		i -= HSIZE;
	
	if (hash_code[i] != 0) {	
		if (hash_prefix[i] == waiting_code && hash_suffix[i] == (UINT8) c) {
			waiting_code = hash_code[i];
			return;
		}
		
		if (i == 0)	// 第二個hash碼 (根據 G. Knott).
			disp = 1;
		else
			disp = HSIZE - i;
		
		while (1) {
			i -= disp;
			if (i < 0) i += HSIZE;
			if (hash_code[i] == 0)  break;			
			if (hash_prefix[i] == waiting_code && hash_suffix[i] == (UINT8) c) {
				waiting_code = hash_code[i];
				return;
			}
		}
	}
	
	// 如果 hashtable[i] 是一個空的, 期望的符號不在表中.
	output(waiting_code);
	if (free_code < LZW_TABLE_SIZE) {
		// 在hash表里增加一個符號.
		hash_code[i] = free_code++;	
		hash_prefix[i] = waiting_code;
		hash_suffix[i] = (UINT8) c;
	} else
		clear_block();
	waiting_code = c;
}

//---------------------------------------------------------------------------
// 結尾保存.
void CLZW::compress_term ()  
{
	// 保存緩沖區里的代碼. 
	if (! first_byte)
		output(waiting_code);
	// 發送一個結束代碼.
	output(EOFCode);
	// 保存 bit-packing 緩沖區數據. 
	if (cur_bits > 0) {
		CHAR_OUT(cur_accum & 0xFF);
	}
	// 保存緩沖區里的代碼. 
	flush_packet();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色大成网站www久久九九| 久久久777精品电影网影网| caoporn国产一区二区| 成人av在线资源网站| 成人av网址在线| av中文字幕不卡| 91麻豆精品在线观看| 欧美亚洲国产bt| 欧美一区二区三区免费大片| 91麻豆精品国产91久久久久久久久 | 欧洲亚洲国产日韩| 欧美一级一区二区| 久久久美女毛片| 一区二区三区色| 国产乱对白刺激视频不卡| 懂色一区二区三区免费观看| 不卡一区在线观看| 91精品国产麻豆国产自产在线| 欧美精品一区二区三区很污很色的| 精品成人在线观看| 亚洲午夜精品在线| 国产成人一区在线| 欧美一区二区私人影院日本| 中文字幕欧美激情| 美国十次综合导航| 欧美亚洲精品一区| 国产亚洲视频系列| 日本成人在线视频网站| 9人人澡人人爽人人精品| 欧美一级电影网站| 亚洲美腿欧美偷拍| 成人午夜电影久久影院| 欧美成人r级一区二区三区| 亚洲综合小说图片| 色香蕉久久蜜桃| 国产精品久久免费看| 国产精品一区二区你懂的| 欧美精品乱码久久久久久| 亚洲综合一区在线| 欧美日韩国产另类不卡| 亚洲欧美韩国综合色| 91蜜桃婷婷狠狠久久综合9色| 久久久亚洲精品石原莉奈| 精品一区二区影视| 精品国产123| 高清日韩电视剧大全免费| 国产日产欧产精品推荐色| 国产精品996| 国产精品蜜臀av| 欧美性大战久久久久久久蜜臀| 亚洲欧美电影院| 欧美三级资源在线| 美女mm1313爽爽久久久蜜臀| 欧美电影免费观看完整版| 国产成人自拍网| 亚洲美女淫视频| 欧美va在线播放| caoporn国产精品| 日韩av网站在线观看| 久久在线观看免费| 91在线免费视频观看| 欧美aⅴ一区二区三区视频| 国产日韩欧美不卡在线| 欧美精品一级二级| 国产99精品国产| 日av在线不卡| 香蕉成人啪国产精品视频综合网 | 久久久精品黄色| 色欧美88888久久久久久影院| 久久国产尿小便嘘嘘| 亚洲一本大道在线| 亚洲丝袜精品丝袜在线| 国产精品美女久久久久高潮| 欧美成人一区二区| 日韩精品中文字幕一区二区三区 | 亚洲精品一二三区| 欧美国产激情二区三区 | 久久99精品久久久久久国产越南 | 色婷婷一区二区| 9i看片成人免费高清| 99久久久免费精品国产一区二区 | 久久精品视频免费观看| 精品美女一区二区三区| 精品91自产拍在线观看一区| 欧美zozo另类异族| 久久久久久免费网| 国产精品白丝在线| 亚洲精品欧美在线| 首页综合国产亚洲丝袜| 日本成人在线网站| 国产精品一区二区x88av| 成人a区在线观看| 欧美在线高清视频| 久久久久久久久免费| 久久青草国产手机看片福利盒子| 久久精品在线免费观看| 亚洲色图丝袜美腿| 丝袜亚洲另类丝袜在线| 精品影院一区二区久久久| 国产成人精品免费网站| 97久久精品人人做人人爽50路| 日本二三区不卡| 久久网这里都是精品| 精品美女一区二区| 亚洲乱码国产乱码精品精可以看| 亚洲国产一二三| 国产成人亚洲综合a∨婷婷图片| 91丨九色丨蝌蚪丨老版| 精品国产第一区二区三区观看体验| 久久综合999| 日韩高清不卡一区二区| 99亚偷拍自图区亚洲| 日韩精品一区二区在线| 亚洲一二三级电影| www.欧美.com| 久久婷婷国产综合精品青草| 亚洲国产精品嫩草影院| 风间由美一区二区三区在线观看 | 亚洲成人午夜电影| 91视频www| 专区另类欧美日韩| 成人午夜又粗又硬又大| 精品精品欲导航| 日韩av电影免费观看高清完整版| 色噜噜久久综合| 亚洲免费观看视频| 91丨porny丨户外露出| 成人免费小视频| fc2成人免费人成在线观看播放| 国产三级久久久| 国产成人精品一区二区三区四区 | 午夜视频久久久久久| 在线看日韩精品电影| 一区二区高清在线| 国产欧美一区二区精品婷婷| 精品一区免费av| 国产午夜精品久久| 成人综合日日夜夜| 亚洲日本在线a| 欧美综合一区二区三区| 日韩在线a电影| 国产亚洲午夜高清国产拍精品| 国产福利91精品| 亚洲愉拍自拍另类高清精品| 日韩一区二区在线看片| 国产成人在线观看免费网站| 亚洲色图视频网站| 精品剧情v国产在线观看在线| 国产成a人亚洲精品| 亚洲不卡一区二区三区| 久久亚洲一区二区三区四区| av在线一区二区三区| 视频一区二区三区中文字幕| 久久久国产精品麻豆| 欧美日韩在线观看一区二区| 久久99国内精品| 亚洲国产视频在线| 中文字幕精品一区二区三区精品 | 国产精品自拍三区| 午夜精品成人在线视频| 国产精品美女久久福利网站 | 日韩av中文字幕一区二区| 一区在线观看视频| 欧美—级在线免费片| 日韩免费一区二区三区在线播放| 色妹子一区二区| av成人老司机| 99久久99久久免费精品蜜臀| 国产精品一级黄| 国内精品国产成人国产三级粉色 | 欧美一级电影网站| 日本一区二区久久| 国产精品全国免费观看高清| 久久婷婷成人综合色| 国产视频在线观看一区二区三区 | 精品亚洲成av人在线观看| 久久99久久精品| 精品无人码麻豆乱码1区2区| 久久99国产精品免费网站| 精品中文字幕一区二区| 国产成人精品亚洲777人妖| 国产一区 二区| 91在线播放网址| 欧美日韩一区二区三区视频| 日韩欧美中文字幕精品| 久久久久久久久久看片| 成人欧美一区二区三区小说| 亚洲激情第一区| 毛片av一区二区| 不卡的电影网站| 欧美日韩精品高清| 久久久精品国产免费观看同学| 国产精品毛片大码女人| 亚洲国产美女搞黄色| 麻豆国产一区二区| 色综合久久88色综合天天6| 91精品婷婷国产综合久久性色 | 精品一区二区免费视频| 91在线你懂得| 国产清纯白嫩初高生在线观看91 |