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

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

?? lzw.cpp

?? lzw算法的實現
?? CPP
字號:
#include <stdio.h>
#include <stdlib.h>

#define MAX 65535				// 字典項的最大數量, 默認采用兩個字節編碼, 且預留最大值作為空值.
								// 這是因為0表示了'\0'而不能表示空. 此值不能隨意修改! default: 65535

#define TIRED 256				// 疲勞忍受值, 當Hash沖突造成的順延量超過此值時, 清空Hash表. default: 256


/* --------------------- Structure Declarations ----------------------- */

struct _DICT {							// 字典結構
	unsigned short pre[MAX];	// 字典項的前綴, 即前面字符的編碼
	char ch[MAX];				// 字典項的后綴, 即最后的字符
};

typedef _DICT DICT;


/* ------------------- Global Function Declarations --------------------- */

void dicInit();													// 初始化或重置字典

int enCode();													// 編碼
int deCode();													// 解碼
void test();													// 調試用, 對用戶無意義

/* ------------------- Global Variable Declarations --------------------- */

DICT _dic; DICT* dic=&_dic;						// 字典
FILE* pf, * nf;									// pf 原文件, nf 壓縮后的文件


/* -------------------------- Source Begins ----------------------------- */

int main()
{
	char cmd; char s[99], t[99];
	printf("===== LZW Text Compression =====\n\n1.Compression\n2.Decompression\n0.Exit\n: ");
	scanf("%c", &cmd); fflush(stdin);
	switch (cmd) {
		case '1':
			printf("\nOrigin File: ");
			scanf("%s", s); fflush(stdin);
			pf=fopen(s, "rb");
			if (!pf) {
				printf("\nCannot find file %s. Please check the filename correct.\n", s);
				system("PAUSE"); return -1;
			}
			printf("Target File: ");
			scanf("%s", t); fflush(stdin);
			nf=fopen(t, "wb");
			printf("\nCompressing...\n"); enCode();
			fclose(pf); fclose(nf);
			break;
		case '2':
			printf("\nOrigin File: ");
			scanf("%s", t); fflush(stdin);
			nf=fopen(t, "rb");
			if (!nf) {
				printf("\nCannot find file %s. Please check the filename correct.\n", t);
				system("PAUSE"); return -1;
			}
			printf("Target File: ");
			scanf("%s", s); fflush(stdin);
			pf=fopen(s, "wb"); 
			printf("\nDecompressing...\n"); deCode();
			fclose(pf); fclose(nf);
			break;
		default:
			break;
	}
	return 0;
}

// 重置字典, 將127以后的項全部清空
void dicInit()
{
	int i;
	for (i=0; i<256; i++) {										// 建立基底, 即0-255的ASCII碼表
		dic->pre[i]=MAX; dic->ch[i]=(char)i;					// 基底的pre是無用的
	}
	for (i=256; i<MAX; i++) dic->pre[i]=MAX;					// 只需清空pre一項即可
}

// 編碼
// 若成功編碼, 返回0, 否則返回-1
int enCode()
{
	char buf[MAX];												// buf 讀取緩沖區
	unsigned short size=0;										// size 緩沖區有效長度
	int forecode, thecode, tmpcode=0;							// forecode 前一編碼, thecode 當前編碼, tmpcode 臨時編碼
	unsigned short tir;											// tir 疲勞度, 即順延的程度
	unsigned short n;											// n 狀態判斷, 1為正常, 0為文件尾, 2為字典已滿

	if (fread(&buf[0], sizeof(char), 1, pf)==0) {				// 空文件, 報錯
		printf("\n原文件為空, 壓縮失敗!\n"); return -1;
	}

	dicInit();													// 初始化字典
	rewind(pf);													// 文件復位, 準備開始
	fread(&buf[0], sizeof(char), 1, pf); size=1;				// 預先讀一個字符
	forecode=tmpcode=(int)buf[0];								// 前一編碼就是ASCII碼

	while (1) {

		/* ---------------- 搜索編碼 ---------------- */

		while (n=fread(&buf[size], sizeof(char), 1, pf)) {		// fread()返回成功讀取的數量, 為0時即文件尾, 跳出循環
			if (size>=MAX-1) {n=2; break;}						// 緩沖區滿, 強制跳出循環并清空字典
			tir=0;												// 疲勞度歸零
			thecode=(tmpcode+256+buf[size])%MAX; if (thecode<256) thecode=256;
			tmpcode=thecode;									// 暫存原始位置, 以備下一循環上面式子使用
			// 編碼的算法是: (長度-1)*256 + 最后一位ASCII + 前面字符串的編碼, 并對MAX取模, 采用順延解決Hash沖突
		
			while (dic->pre[thecode]!=forecode || dic->ch[thecode]!=buf[size]) {
				if (dic->pre[thecode]==MAX) break;				// 編碼不存在, 跳出循環并準備新建
				if (++tir>TIRED) { n=2; break;}					// 疲勞度超過忍受值時, 設置狀態值為2, 跳出循環并準備寫入文件后清空字典
				thecode=(thecode+1)%MAX; if (thecode<256) thecode=256;
			}
			if (dic->pre[thecode]==MAX || n==2) break;			// 編碼為空或字典已滿時, 跳出搜索循環, 準備新建
			forecode=thecode; size++;							// 找到編碼, 儲存前一編碼, 繼續循環
		}

		/* ---------------- 寫入文件 ---------------- */

		tir=(unsigned short)forecode;							// 找一個地方把forecode轉成unsigned short
		fwrite(&tir, sizeof(unsigned short), 1, nf);
		if (n==0) break;										// 文件結束, 跳出所有循環

		/* --------------- 新建字典項 --------------- */

		if (n==2) dicInit();									// 字典滿時清空字典
		else { dic->pre[thecode]=forecode; dic->ch[thecode]=buf[size];}
		buf[0]=buf[size]; size=1; forecode=tmpcode=(int)buf[0];	// 保留查找失敗的字符, 進入搜索循環

	}
	return 0;
}

// 解碼
// 若成功解碼, 返回0, 否則返回-1
int deCode()
{
	char buf1[MAX], buf2[MAX];									// buf1, buf2 寫入緩沖區, 緩沖區內的字符串都是逆序排列的, 方便操作
	unsigned short size1=0, size2=0;							// size1, size2 各緩沖區尾部位置
	unsigned short forecode, thecode=MAX;						// forecode 前一編碼, thecode 當前編碼
	int tmpcode;												// tmpcode 臨時編碼
	unsigned short tir;											// tir 疲勞度, 即順延的程度
	unsigned short n;											// n 狀態判斷, 1為正常, 0為文件尾, 2為字典已滿, 3為讀到未知編碼
	int i;														// 臨時變量

	if (fread(&thecode, sizeof(unsigned short), 1, nf)==0) {	// 空文件, 報錯
		printf("\n壓縮文件為空, 解壓失敗!\n"); return -1;
	}

	dicInit(); rewind(nf);										// 初始化字典并將文件復位, 準備開始

	while (1) {

		/* ---------------- 讀入編碼 ---------------- */

		forecode=thecode;										// 將上一編碼保存
		n=fread(&thecode, sizeof(unsigned short), 1, nf);

		/* ------------ 譯碼并寫入緩沖區 ------------ */
		
		if (dic->pre[thecode]==MAX && thecode>255) {			// 字典項不存在的情況
			// 這是因為在壓縮時剛生成的字典項馬上被使用, 而解壓生成的速度比壓縮時慢一步造成的
			// 這只有在一種情況下發生, 就是當前項加上當前項的首字的搭配, 由此可給出此解決方法
			dic->pre[thecode]=forecode; dic->ch[thecode]=buf1[size1-1]; n=3;
		}

		tmpcode=thecode;										// 迭代初值
		do {													// 迭代開始, 將字符依次讀出, 得到逆序字符串
			buf2[size2++]=dic->ch[tmpcode];						// 讀取時寫入緩沖區2
			tmpcode=dic->pre[tmpcode];
		} while (tmpcode<MAX);

		/* ---------- 寫入文件和新建字典項 ---------- */

		if (size1>0 && n) {										// 不是文件頭或文件尾時, 寫入文件并新建字典項

			for (i=size2-1; i>=0; i--) fwrite(&buf2[i], sizeof(char), 1, pf);
																// 將buf2中的字符串寫入文件
			
			if (size1>=MAX-2) n=2;								// buf1緩沖區滿, 強制清空字典
			if (n<2) {											// n==3時字典項已經新建過了, 故不再新建
				tmpcode=size1*256;
				for (i=size1-1; i>=0; i--) tmpcode+=(int)buf1[i];
				tmpcode=(tmpcode+(int)buf2[size2-1])%MAX;		// 這三句利用算法求得編碼的公式位置
				// 新的編碼為前一字符串buf1的所有字符加當前字符串buf2的第一個字符, 注意字符串的存儲是逆序的
			
				tir=0;											// 疲勞度歸零
				while (dic->pre[tmpcode]<MAX) {					// 字典項沖突, 順延解決沖突
					if (++tir>TIRED) { n=2; break;}				// 字典滿了
					tmpcode=(tmpcode+1)%MAX; if (tmpcode<256) tmpcode=256;
				}
				if (n!=2) {	dic->pre[tmpcode]=forecode; dic->ch[tmpcode]=buf2[size2-1];}
			}													// 本循環按照上面的規則新建字典項 
			if (n==2) {
				dicInit(); buf1[0]=buf2[0]; size1=1; size2=0;
			}													// 字典滿時, 清空字典并更新緩沖區
			else {
				for (i=0; i<size2; i++) buf1[i]=buf2[i];
				size1=size2; size2=0;							// 這兩句將緩沖區更新, 把當前字符串buf2復制到buf1, 并清空buf2
			}

		}
		else if (n) {
			fwrite(&buf2[0], sizeof(char), 1, pf);				// 文件頭只有一個字符, 寫入即可
			buf1[0]=buf2[0]; size1=1; size2=0;					// 更新緩沖區和size
		}
		else break;												// 文件結束, 退出循環

	}
	return 0;
}

void test()														// 調試用, 對用戶無意義
{
	FILE* tf1=fopen("result.bin", "rb");
	FILE* tf2=fopen("debug.txt", "w");
	unsigned short t;
	while (fread(&t, sizeof(unsigned short), 1, tf1)) fprintf(tf2, "%d ", t);
	fclose(tf1); fclose(tf2);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
同产精品九九九| 日本成人在线网站| 国产盗摄一区二区三区| 99精品久久免费看蜜臀剧情介绍| 久久日韩粉嫩一区二区三区| 极品美女销魂一区二区三区| 欧美成人福利视频| 国产精品自拍一区| 中文一区二区完整视频在线观看| 成人在线视频首页| 亚洲视频免费观看| 精品视频资源站| 日韩成人免费在线| 久久久不卡网国产精品一区| 成人激情文学综合网| 亚洲激情网站免费观看| 在线电影欧美成精品| 久久99热这里只有精品| 国产日韩欧美高清| 在线免费不卡电影| 久久精品国产免费| 国产精品久久久久国产精品日日| 在线视频欧美区| 久草这里只有精品视频| 国产精品国产自产拍在线| 在线观看中文字幕不卡| 蜜桃视频免费观看一区| 国产精品毛片大码女人| 欧美日韩mp4| 黄网站免费久久| 亚洲欧洲一区二区在线播放| 欧美福利视频导航| 成人avav影音| 蜜桃一区二区三区在线| 亚洲视频 欧洲视频| 日韩欧美的一区| 色综合中文字幕国产| 亚洲成av人片在线观看无码| 久久久久久久电影| 欧美日韩亚洲另类| 岛国一区二区在线观看| 婷婷一区二区三区| **欧美大码日韩| 欧美tickle裸体挠脚心vk| 在线精品视频一区二区三四 | 久久视频一区二区| 一本色道亚洲精品aⅴ| 国产尤物一区二区| 视频在线观看国产精品| 亚洲欧美自拍偷拍| 久久人人97超碰com| 欧美日本一区二区在线观看| 成+人+亚洲+综合天堂| 久久电影国产免费久久电影 | 欧美日韩一区二区三区在线看| 国产乱一区二区| 免费成人美女在线观看.| 亚洲精品亚洲人成人网在线播放| 2024国产精品| 欧美一级久久久久久久大片| 色av成人天堂桃色av| 成人网在线免费视频| 裸体一区二区三区| 三级精品在线观看| 亚洲一区在线电影| 亚洲色图19p| 综合中文字幕亚洲| 亚洲欧洲精品一区二区精品久久久 | 91美女精品福利| 成人亚洲精品久久久久软件| 激情五月激情综合网| 日韩中文字幕亚洲一区二区va在线 | 色欧美日韩亚洲| www.在线欧美| 国产sm精品调教视频网站| 国精产品一区一区三区mba桃花| 免费在线成人网| 日韩精品91亚洲二区在线观看| 亚洲bdsm女犯bdsm网站| 亚洲国产日产av| 午夜电影一区二区| 天堂成人免费av电影一区| 亚洲午夜久久久久久久久电影网 | 欧洲视频一区二区| 在线观看成人免费视频| 欧美亚洲国产bt| 欧美色倩网站大全免费| 欧美嫩在线观看| 日韩欧美高清一区| 久久久久久一级片| 国产精品三级电影| 亚洲激情在线激情| 亚洲超丰满肉感bbw| 午夜电影网亚洲视频| 久久精品72免费观看| 国产成人综合网站| 91在线视频网址| 欧美性猛片xxxx免费看久爱| 555夜色666亚洲国产免| 欧美成人猛片aaaaaaa| 欧美精品一区二区三区一线天视频| 久久免费国产精品| 日韩理论在线观看| 五月天精品一区二区三区| 久久精品99国产精品| 成人性生交大片| 欧美午夜一区二区| 精品国产一二三区| 中文字幕在线不卡视频| 午夜激情久久久| 国产福利91精品| 欧美日韩在线播放| 国产日产欧美精品一区二区三区| 亚洲视频中文字幕| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品一区二区在线播放| 91丨porny丨蝌蚪视频| 日韩亚洲欧美一区二区三区| 日本一区二区综合亚洲| 五月婷婷综合激情| 国产99久久久久久免费看农村| 欧美亚洲综合一区| 亚洲欧洲综合另类| 午夜精品久久一牛影视| 国产剧情av麻豆香蕉精品| 91成人看片片| 精品国产免费一区二区三区香蕉| 亚洲婷婷在线视频| 久久精品72免费观看| 在线一区二区三区四区五区| 日韩精品中文字幕一区| 一区二区高清免费观看影视大全 | 麻豆成人在线观看| 91亚洲精华国产精华精华液| 精品日本一线二线三线不卡| 亚洲人123区| 福利视频网站一区二区三区| 69精品人人人人| 一区二区三区精品视频在线| 国产精品亚洲一区二区三区妖精| 欧美无乱码久久久免费午夜一区 | 欧美一级生活片| 亚洲精品国产一区二区精华液 | 欧美顶级少妇做爰| 国产精品久久久久影院亚瑟| 久久99久久久欧美国产| 欧美日韩亚洲综合在线 | 亚洲地区一二三色| 成人97人人超碰人人99| 欧美videofree性高清杂交| 亚洲va国产天堂va久久en| 91片在线免费观看| 中文字幕欧美三区| 国产乱码精品一区二区三区忘忧草| 欧美日韩色一区| 亚洲黄色免费电影| 色综合久久天天| 国产精品国产馆在线真实露脸 | 91精品在线免费| 午夜伦理一区二区| 欧美午夜精品电影| 亚洲一区在线观看网站| 色综合激情五月| 亚洲精品中文字幕在线观看| 一本大道av一区二区在线播放| 国产精品久久久一本精品| 福利一区二区在线| 日韩av成人高清| 6080yy午夜一二三区久久| 午夜精品免费在线| 91精品国产色综合久久不卡电影| 午夜精品aaa| 日韩欧美成人午夜| 韩国欧美一区二区| 欧美激情中文字幕一区二区| 懂色一区二区三区免费观看| 欧美经典一区二区| 91亚洲国产成人精品一区二三| 亚洲精品成人a在线观看| 91视频一区二区三区| 一区二区三区产品免费精品久久75| 在线观看成人免费视频| 爽好久久久欧美精品| 日韩视频免费观看高清在线视频| 久久精品国产澳门| 国产婷婷精品av在线| 91一区二区三区在线观看| 一级特黄大欧美久久久| 欧美美女一区二区| 精品在线免费视频| 国产精品高潮久久久久无| 欧日韩精品视频| 免费美女久久99| 中文字幕精品—区二区四季| 色综合久久久久| 麻豆精品视频在线观看| 国产精品久久久久精k8| 欧美日韩高清一区二区| 国产福利一区在线观看| 夜夜嗨av一区二区三区四季av|