合肥工業(yè)大學(xué) 信息論與編碼 實(shí)驗(yàn)報(bào)告 完整代碼版_第1頁
合肥工業(yè)大學(xué) 信息論與編碼 實(shí)驗(yàn)報(bào)告 完整代碼版_第2頁
合肥工業(yè)大學(xué) 信息論與編碼 實(shí)驗(yàn)報(bào)告 完整代碼版_第3頁
合肥工業(yè)大學(xué) 信息論與編碼 實(shí)驗(yàn)報(bào)告 完整代碼版_第4頁
合肥工業(yè)大學(xué) 信息論與編碼 實(shí)驗(yàn)報(bào)告 完整代碼版_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、計(jì)算機(jī)與信息學(xué)院 信息論與編碼 實(shí)驗(yàn)報(bào)告專 業(yè) 班 級(jí) 信息安全13-1班 學(xué)生姓名及學(xué)號(hào) 馬駿 2013211869 課程教學(xué)班號(hào) 任 課 教 師 蘇兆品 實(shí)驗(yàn)指導(dǎo)教師 蘇兆品 實(shí)驗(yàn)地點(diǎn) 逸夫樓 2014 2015 學(xué)年第 一 學(xué)期實(shí)驗(yàn)1 霍夫曼編碼一、 基本要求 通對(duì)任意輸入的字符串序列進(jìn)行3元霍夫曼編碼,給出編碼結(jié)果、編碼效率;并實(shí)現(xiàn)相應(yīng)的譯碼操作。二、 提升要求對(duì)一幅BMP格式的灰度圖像進(jìn)行二元霍夫曼編碼。三、 問題描述1、 三元霍夫曼編碼首先需要考慮的是如何表示三元2、 三元霍夫曼編碼需要對(duì)不滿足2n+3的情況做處理3、 使用什么數(shù)據(jù)結(jié)構(gòu)建立霍夫曼樹四、算法思想 1、使用兩個(gè)二進(jìn)制位

2、表示一個(gè)三元變量,即00表示a、01表示b、11表示c。 2、出現(xiàn)不滿足2n+3情況即需要加入一個(gè)出現(xiàn)次數(shù)為0次的字符,遍歷已經(jīng)出現(xiàn)的字符,找到一種八位二進(jìn)制組合作為新字符。 3、建立霍夫曼樹的算法,使用數(shù)組的結(jié)構(gòu)作為整棵樹的空間,其中每個(gè)數(shù)組元素是一個(gè)類的實(shí)例。 在這各類里封裝了他所代表的字符(如果不是葉子節(jié)點(diǎn)則為null)、出現(xiàn)的次數(shù)(非葉子結(jié)點(diǎn)則為子節(jié)點(diǎn)的此項(xiàng)加和)。 承載整棵樹的數(shù)組也是封裝在一個(gè)類里的,這個(gè)類同時(shí)封裝了對(duì)這棵樹的操作,如添加節(jié)點(diǎn)、樹節(jié)點(diǎn)排序等,這樣就可以使從添加葉子節(jié)點(diǎn)后建立整棵霍夫曼樹。5、 模塊劃分char huancunmax;/從文件中讀入的字符char ya

3、suohuancunmax;/壓縮后可以寫進(jìn)文件中的字符串 long int yasuohuancunnumber=0;/準(zhǔn)備寫入文件中的個(gè)數(shù)long int huancunnumber=0;/從文件中讀出字符個(gè)數(shù)class treevoid set(int a,int b,int c,int d,int e)/次數(shù)為a,左孩子為b,中孩子為c,右孩子為d,自己的編號(hào)eint mynumber;/次數(shù)int leftsonnumber;/數(shù)組編號(hào)int middlesonnumber;int rightsonnumber;/數(shù)組編號(hào) 控制時(shí)沒有兒子節(jié)點(diǎn)則兒子都是負(fù)數(shù)int myzifunumb

4、er;/作為葉子節(jié)點(diǎn)在數(shù)組中的編號(hào);class table/壓縮對(duì)照表public:table()void cutrealfile()/將緩存中一樣的字符區(qū)別開void uncheck(char huancun)/檢查是否出現(xiàn)過字符bool check(char huancun)/檢查源文件字符是否出現(xiàn)過int checkhuancun(int i)/讀緩存數(shù)組的字符,返回yasuozifu數(shù)組中的地址void count(tree fun,int begin,int end)/beginend區(qū)間內(nèi)排序char h3setonechar(char n1,char n2,char n3,cha

5、r n4)/三元霍夫曼給進(jìn)一個(gè)char 位操作使用內(nèi)聯(lián)匯編語言 d 是不會(huì)被譯碼的 為了補(bǔ)齊余碼void linshih3manage(char ptr)/進(jìn)來字符存起來 每四個(gè)存一個(gè)void writesign(tree fun,int permitnumber,char k,int futhernumber)/先給sign的值 遞歸構(gòu)建霍夫曼樹void hafuman3()/三元霍夫曼編碼函數(shù)void codemanage()/對(duì)整個(gè)緩存進(jìn)行編碼 bool checkh3code(string ptr)/對(duì)解壓縮后的碼串譯碼void jiemah3code(char ptr)/對(duì)一個(gè)cha

6、r型8位進(jìn)行解碼為4個(gè)char型 void discodemanage()/解壓縮程序 使用huancun放密文,解壓后原文放在yasuohuancun中 char linshih34;/臨時(shí)三元霍夫曼 int linshih3number;/記錄臨時(shí)三元霍夫曼個(gè)數(shù) int number;/未壓縮字符的數(shù)量 int everyzifunumbermax;/每個(gè)字符出現(xiàn)的次數(shù) string signmax;/壓縮后的字符(先用數(shù)字表示) string paixusignmax;/編碼后與paxu字符數(shù)組對(duì)應(yīng)的編碼 char paixuzifumax;/和字符數(shù)組一樣,順序?qū)?yīng)paixusign

7、char zifumax;/未壓縮的字符(互不相同);void readfile(const char* realfile) /文件讀入緩存void writefile(const char*yasuofile)/緩存寫入文件int main()/主函數(shù) readfile(realfile); table mytable; mytable.cutrealfile(); mytable.hafuman3(); mytable.codemanage(); writefile(yasuofile); readfile(yasuofile); mytable.discodemanage(); writ

8、efile(jieyasuofile); return 0; 6、 測試數(shù)據(jù) 2.txt文件 n999.bmp文件1、 2.txt文件hello markchalse,this is a secretnumber 6424155please put this in an code小刀司令壓縮后:將埼績髱釜#?庩宏壕券? :,煥?0鼜>?姾嫧偪瘞旰?3?飶卡8*解壓縮后(最后多了一字節(jié)空格):hello markchalse,this is a secretnumber 6424155please put this in an code小刀司令壓縮情況:源文件:壓縮文件:解壓縮文件:編碼分

9、析:無損壓縮 壓縮率:74.16%2、 n999.bmp壓縮后:解壓縮無失真壓縮7、 源程序 (見附錄)實(shí)驗(yàn)2算術(shù)編碼一、基本要求對(duì)任意輸入的字符串序列進(jìn)行自適應(yīng)編碼,并設(shè)計(jì)相應(yīng)的譯碼二、提升要求對(duì)一幅bmp格式的灰度圖像進(jìn)行自適應(yīng)算術(shù)編碼,并設(shè)計(jì)相應(yīng)的譯碼三、問題描述1、算術(shù)編碼的過程實(shí)際就是對(duì)兩個(gè)小數(shù)確定的取區(qū)間,劃分區(qū)間,再取區(qū)間不斷重復(fù)的過程,將采用什么數(shù)據(jù)結(jié)構(gòu)。2、自適應(yīng)編碼如何確定小數(shù)的誤差以保證無誤差即零失真3、Long double只有二十幾位 如何壓縮更多的內(nèi)容四、算法思想1、將上邊界,下邊界分別記錄,并封裝在一個(gè)類中。類中還封裝了對(duì)區(qū)間選擇、改變上界下界值的函數(shù)等。2、區(qū)計(jì)

10、算后的各字符概率的小數(shù)后八位保證無誤差3、為保證壓縮足夠多的量,不采用long double記錄上下界的值,而是采用int型數(shù)組來記錄上下界的值,每個(gè)long int 取七位十進(jìn)制數(shù)。這樣初始max值為10000,所以整個(gè)算法可以進(jìn)行小數(shù)點(diǎn)后70000位的小數(shù)加減乘除取對(duì)數(shù)等運(yùn)算,保證了可壓縮量五、模塊劃分因?yàn)橐M(jìn)行長數(shù)位計(jì)算 所以用一個(gè)long int的數(shù)組將每個(gè)單元表示7位十進(jìn)制數(shù) 按max=10000 的初始 可以達(dá)小數(shù)點(diǎn)后70000位在存儲(chǔ)大數(shù)時(shí)數(shù)組按距離小數(shù)點(diǎn)越近越靠左的順序碼放用一個(gè)類封裝數(shù)據(jù)和操作方便對(duì)數(shù)據(jù)的掉用,省得一會(huì)形參一會(huì)實(shí)參下邊界為準(zhǔn)注意length中是按照小數(shù)的格式

11、如果某一元組其不滿7位則前面為0 將length連起來表示數(shù)時(shí) 一定要注意步驟:1、將原文件讀入緩存 2、統(tǒng)計(jì)原文件字符的種類有多少 頻率分別是多少(自適應(yīng)) 提示:計(jì)算頻率 double c=double(a)/double(b); 3、接下來 在arithmetic_coding中 根據(jù)緩存中每個(gè)字符 獲得最后的概率 getposible(char)得到給定字符的概率區(qū)間 getlength()計(jì)算區(qū)間長度 int getint(double)將概率小數(shù)轉(zhuǎn)化成整數(shù) class posible_8:set(int) lowposible highposible 在這里先通過getint()轉(zhuǎn)

12、化為8位整數(shù)再變成4個(gè)2位的整數(shù)方便計(jì)算 接下來用posible_8 的每一個(gè)數(shù)組元素(兩位)從length最后開始乘并向前進(jìn)位 mathmatic:int getreallength()/得到length數(shù)字的準(zhǔn)確位數(shù) class posible_8:int getlong()/得到every2bit的小數(shù)位長 mathmatic:int getbeginlength()/得到length數(shù)字的從開始到最后一個(gè)數(shù)字的準(zhǔn)確位數(shù) mathmatic:void dealhigh()/high=low+lowposible*length=low+length(已處理) mathmatic:void

13、cuthigh()/high 后面不需要的為零的元組要約去 mathmatic:void deallow()/low=low+lowposible*length=low+length(已處理) mathmatic:void cutlow()/low 后面不需要的為零的元組要約去 4、mathmatic:void code()將最后的low進(jìn)行二進(jìn)制編碼存入yasuohuancun中 #include<math.h>之后就可以直接使用log了 以2為底的對(duì)數(shù)可以用換底公式表示 log(n)/log(2) 不能用log()求一個(gè)數(shù)組表示的大數(shù)的原因是 log(a+b)根本無法拆解啊 不

14、要說把a(bǔ)+b分解成c*d*. 但我們可以使用簡單粗暴的0.5*0.5*0.5.迭代進(jìn)行直到找到那個(gè)整數(shù)部分 mathmatic:int getlog()/返回log(length) mathmatic:int checksize(long int goalmax,int goalnumber,long int lowmax,int lownumber)/比較兩個(gè)正規(guī)小數(shù)大小 goal小返回1 大0 相等2 mathmatic:void dealmycode()/將mycode中的十進(jìn)制表示的二進(jìn)制轉(zhuǎn)化為二進(jìn)制存入yasuohuancun中 5、mathmatic:void discode()/

15、解壓縮 壓縮文件已讀入huancun 第一個(gè)是 以前的huancunnumber mathmatic:void deal8bit(char kp,int overbit)/計(jì)算nowlowmathmatic:void addnowlow()/low+nowlowdiscode()現(xiàn)在low已經(jīng)有了,接下來需要比較yasuohuancunnumber次就可以還原以前的huancun了 不過需要重用nowlow作為目標(biāo)小數(shù) low每次需要做運(yùn)算 int getzifu() 函數(shù)中代碼重用:重用arithmetic_coding()代碼 直接用checksize()BUG: discode()不知道

16、為什么要減1 最后一個(gè)字符11111111 這個(gè)bug還沒有修復(fù) 這個(gè)bug非常嚴(yán)重 導(dǎo)致如原文件內(nèi)容為abc 無法六、測試數(shù)據(jù) 2.txt文件 n77.bmp文件1、 2.txt文件hello markchalse,this is a secretnumber 6424155please put this in an code小刀司令壓縮后: 稬?睖?反.媹錄? 缶m郜緕k?.?=X杛楞璩tm?桶程序過程:解壓縮后:hello markchalse,this is a secretnumber 6424155please put this in an code小刀司令壓縮情況:源文件:壓縮文

17、件:解壓縮文件:編碼分析:無損壓縮 壓縮率:65.17%2、 n77.bmp壓縮文件: 傝?靯左m鮏.=W噀Z鐢?霑楞壗Y(jié)O?濖?痦畝?湍叚?Jz?V摮|_p濔?褺S?老z7?tJ?料c鶻H娀止程序過程:解壓縮后:壓縮情況:源文件:壓縮文件:解壓縮文件:編碼分析:無損壓縮 壓縮率:32.96%7、 源程序 (見附錄)8、 總結(jié) 通過此次實(shí)驗(yàn),我在學(xué)習(xí)編碼原理的進(jìn)一步學(xué)習(xí)了各種無失真信源編碼的編程方法,使我對(duì)信息論與編碼有了更深的了解。程序中還存在很多的不足,希望在以后的學(xué)習(xí)中可以做到更加完善。附錄Hafuman.cpp/*基本要求:對(duì)任意輸入字符串進(jìn)行三元哈弗曼編碼*/#include<

18、iostream>#include<string>#include<fstream>#include <sstream>using namespace std;const char* realfile="n77.bmp"const char* yasuofile="n3.txt"const char* jieyasuofile="n4.bmp"const int max=10000;char huancunmax;/從文件中讀入的字符char yasuohuancunmax;/壓縮后可以寫進(jìn)文

19、件中的字符串long int yasuohuancunnumber=0;/準(zhǔn)備寫入文件中的個(gè)數(shù)long int huancunnumber=0;/從文件中讀出字符個(gè)數(shù)class treepublic:tree();void set(int a,int b,int c,int d,int e)/次數(shù)為a,左孩子為b,中孩子為c,右孩子為d,自己的編號(hào)emynumber=a;leftsonnumber=b;middlesonnumber=c;rightsonnumber=d;myzifunumber=e;int mynumber;/次數(shù)int leftsonnumber;/數(shù)組編號(hào)int midd

20、lesonnumber;int rightsonnumber;/數(shù)組編號(hào) 控制時(shí)沒有兒子節(jié)點(diǎn)則兒子都是負(fù)數(shù)int myzifunumber;/作為葉子節(jié)點(diǎn)在數(shù)組中的編號(hào);class table/壓縮對(duì)照表public:table() number=0; linshih3number=0; ; void cutrealfile()/將緩存中一樣的字符區(qū)別開 int x; for(x=0;x<huancunnumber;x+) if(check(huancunx)/如果是不一樣的字符則存進(jìn)zifu數(shù)組 zifunumber=huancunx; everyzifunumbernumber=1;

21、 number+; double i=number; if(i/2>number/2)/ 三元霍夫曼滿足2n+3 不就是奇數(shù)嗎 但1不滿足 還沒考慮1 以后注意維護(hù) cout<<"right number!"<<endl; else cout<<"wrong number!"<<endl; char tmd;/尋找不可能出現(xiàn)的8位二進(jìn)制數(shù) tmd _asm mov tmd,01001101b; if(check(tmd) zifunumber=huancunx; everyzifunumbernumb

22、er=0; number+; else uncheck(tmd); _asm mov tmd,01101001b; if(check(tmd) zifunumber=huancunx; everyzifunumbernumber=0; number+; else uncheck(tmd); cout<<"-zifu-"<<endl; for(x=0;x<number;x+) cout<<zifux<<" 次數(shù):"<<everyzifunumberx<<endl; cout<

23、;<"number="<<number<<endl; ; void uncheck(char huancun)/檢查是否出現(xiàn)過字符 int x; for(x=0;x<number;x+) if(zifux=huancun) everyzifunumberx-; ; bool check(char huancun)/檢查源文件字符是否出現(xiàn)過 int x; for(x=0;x<number;x+) if(zifux=huancun) everyzifunumberx+; return false; return true; ; int

24、checkhuancun(int i)/讀緩存數(shù)組的字符,返回yasuozifu數(shù)組中的地址 char a=huancuni; int x=0; for(x=0;x<number;x+) if(paixuzifux=a) return x; return -1; ; void count(tree fun,int begin,int end)/beginend區(qū)間內(nèi)排序 int x,y; tree a; for(x=begin;x<end-1;x+) for(y=x+1;y<end;y+) if(funx.mynumber>funy.mynumber) a=funx;

25、funx=funy; funy=a; ; char h3setonechar(char n1,char n2,char n3,char n4)/三元霍夫曼給進(jìn)一個(gè)char 位操作使用內(nèi)聯(lián)匯編語言 /d 是不會(huì)被譯碼的 為了補(bǔ)齊余碼 char onechar; if(n1='a') _asm mov onechar,00h; if(n1='b') _asm mov onechar,11000000b; if(n1='c') _asm mov onechar,10000000b; if(n1='d') _asm mov onechar

26、,01000000b; if(n2='a') _asm or onechar,00000000b; if(n2='b') _asm or onechar,00110000b; if(n2='c') _asm or onechar,00100000b; if(n2='d') _asm or onechar,00010000b; if(n3='a') _asm or onechar,00000000b; if(n3='b') _asm or onechar,00001100b; if(n3='c

27、') _asm or onechar,00001000b; if(n3='d') _asm or onechar,00000100b; if(n4='a') _asm or onechar,00000000b; if(n4='b') _asm or onechar,00000011b; if(n4='c') _asm or onechar,00000010b; if(n4='d') _asm or onechar,00000001b; return onechar; ; void linshih3manag

28、e(char ptr)/進(jìn)來字符存起來 每四個(gè)存一個(gè) linshih3linshih3number=ptr; linshih3number+; if(linshih3number=4) yasuohuancunyasuohuancunnumber=h3setonechar(linshih30,linshih31,linshih32,linshih33); linshih3number=0; yasuohuancunnumber+; ; void writesign(tree fun,int permitnumber,char k,int futhernumber)/先給sign的值 遞歸構(gòu)建霍

29、夫曼樹 if(futhernumber=-1)signpermitnumber="" else signpermitnumber=signfuthernumber+k; / cout<<signpermitnumber<<" " if(funpermitnumber.myzifunumber<0)/父親節(jié)點(diǎn) if(funpermitnumber.rightsonnumber>=0)writesign(fun,funpermitnumber.rightsonnumber,'c',permitnumber)

30、; if(funpermitnumber.middlesonnumber>=0)writesign(fun,funpermitnumber.middlesonnumber,'b',permitnumber); if(funpermitnumber.leftsonnumber>=0)writesign(fun,funpermitnumber.leftsonnumber,'a',permitnumber); ; void hafuman3()/三元霍夫曼編碼函數(shù) cout<<"-use 3 leaves hafman tree-&q

31、uot;<<endl; /*電腦明明是0、1二元碼偏偏用3元編碼 只能用兩位二元碼表示一位三元碼 但這樣本來壓縮效率挺高的三元霍夫曼編碼竟然不如二元霍夫曼真是醉了 三元霍夫曼編碼一開始 的葉子節(jié)點(diǎn)數(shù) 一定要滿足2n+3的特點(diǎn) 這個(gè)最后還是要處理 三元 則sign分別用0 1 2 表示三元后的編碼 */ int familynumber;/記錄有多少組父親、兒子節(jié)點(diǎn)記錄 int x;/常規(guī)變量 int h3number=number;/初始葉子數(shù) int begin=0; char h3zifumax; for(x=0;x<number;x+) h3zifux=zifux; t

32、ree h3treemax; for(x=0;x<h3number;x+)/初始化葉子節(jié)點(diǎn) h3treex.set(everyzifunumberx,-1,-1,-1,x); / count(h3tree,0,h3number); / for(x=0;x<h3number;x+) / / cout<<h3zifuh3treex.myzifunumber<<" 次數(shù):"<<h3treex.mynumber<<endl; / while(begin<h3number-1)/這里注意 最后一次實(shí)際上begin是在里

33、面與h3number相等 count(h3tree,begin,h3number);cout<<"*排序*"<<endl; / for(x=begin;x<h3number;x+)/ / cout<<h3zifuh3treex.myzifunumber<<" 次數(shù):"<<h3treex.mynumber<<endl;/cout<<"begin: "<<begin<<" " h3treeh3number.

34、set(h3treebegin.mynumber+h3treebegin+1.mynumber+h3treebegin+2.mynumber,begin,begin+1,begin+2,-1); cout<<h3treeh3number.leftsonnumber<<" "<<h3treeh3number.middlesonnumber<<" "<<h3treeh3number.rightsonnumber<<endl; begin=begin+3; cout<<h3nu

35、mber<<endl; h3number+; / cout<<h3number<<endl; writesign(h3tree,h3number-1,'a',-1); cout<<h3number<<endl; for(x=0;x<h3number;x+) cout<<" 次數(shù)"<<h3treex.mynumber<<" "<<signx<<endl; cout<<"-原字符編碼-"

36、<<endl; int t=0; for(x=0;x<h3number;x+) if(h3treex.myzifunumber>=0) cout<<h3zifuh3treex.myzifunumber<<" 次數(shù)"<<h3treex.mynumber<<" "<<signx<<endl; paixusignt=signx; paixuzifut=h3zifuh3treex.myzifunumber; t+; cout<<"number o

37、f zifu:"<<t<<endl; ; void codemanage()/對(duì)整個(gè)緩存進(jìn)行編碼 cout<<"-in code manage program-"<<endl; cout<<"字符 "<<" 壓縮字符 "<<endl; int x,i,y; for(x=0;x<number;x+) cout<<paixuzifux<<" "<<paixusignx<<e

38、ndl; for(x=0;x<huancunnumber;x+) / cout<<"正在處理 :"<<huancunx<<" " i=checkhuancun(x);/ cout<<"paixuzifu"<<i<<"="<<paixuzifui<<" " for(y=0;y<paixusigni.length();y+) / cout<<paixusigniy; linshih

39、3manage(paixusigniy);/注意這里有點(diǎn)二維數(shù)組的感覺 / cout<<endl; if(linshih3number!=0)/補(bǔ)齊一個(gè)char型8位最后幾位 int tt; for(tt=linshih3number;tt<4;tt+) linshih3tt='d' yasuohuancunyasuohuancunnumber=h3setonechar(linshih30,linshih31,linshih32,linshih33); linshih3number=0; yasuohuancunnumber+; ; bool checkh3c

40、ode(string ptr)/對(duì)解壓縮后的碼串譯碼 int x; /cout<<"i want find "<<ptr<<" " for(x=0;x<number;x+) if(ptr=paixusignx)/這里string又可以用“=”來比較了?不是.equal()嗎? cout<<"find "<<x<<" "<<paixusignx<<" "<<paixuzifux<

41、<endl; yasuohuancunyasuohuancunnumber=paixuzifux; yasuohuancunnumber+; return true; return false;/ cout<<"no find waiting."<<endl; ; void jiemah3code(char ptr)/對(duì)一個(gè)char型8位進(jìn)行解碼為4個(gè)char型 char pp=ptr; char n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15;/n13 n14 n15沒用 _asm mov

42、 n1,00h; mov n2,11000000b; mov n3,10000000b; mov n4,00h; mov n5,00110000b; mov n6,00100000b; mov n7,00h; mov n8,00001100b; mov n9,00001000b; mov n10,00h; mov n11,00000011b; mov n12,00000010b; mov n13,00010000b; mov n14,00000100b; mov n15,00000001b; and pp,11000000b; if(pp=n1) linshih30='a' i

43、f(pp=n2) linshih30='b' if(pp=n3) linshih30='c' pp=ptr; _asm and pp,00110000b; if(pp=n4) linshih31='a' if(pp=n5) linshih31='b' if(pp=n6) linshih31='c' if(pp=n13) linshih31='d' pp=ptr; _asm and pp,00001100b; if(pp=n7) linshih32='a' if(pp=n8) lins

44、hih32='b' if(pp=n9) linshih32='c' if(pp=n14) linshih32='d' pp=ptr; _asm and pp,00000011b; if(pp=n10) linshih33='a' if(pp=n11) linshih33='b' if(pp=n12) linshih33='c' if(pp=n15) linshih33='d' ; void discodemanage()/解壓縮程序 使用huancun放密文,解壓后原文放在yasuo

45、huancun中 /文件開始的對(duì)應(yīng)表讀進(jìn)paixusign和paixuzifu中 /還要使用linshih3 cout<<"-enter in discode manage program-"<<endl; yasuohuancunnumber=0; string holdptr="" int x,y; for(x=0;x<huancunnumber;x+) jiemah3code(huancunx); for(y=0;y<4;y+) holdptr=holdptr+linshih3y; if(checkh3code(

46、holdptr) holdptr="" ; char linshih34;/臨時(shí)三元霍夫曼 int linshih3number;/記錄臨時(shí)三元霍夫曼個(gè)數(shù) int number;/未壓縮字符的數(shù)量 int everyzifunumbermax;/每個(gè)字符出現(xiàn)的次數(shù) string signmax;/壓縮后的字符(先用數(shù)字表示) string paixusignmax;/編碼后與paxu字符數(shù)組對(duì)應(yīng)的編碼 char paixuzifumax;/和字符數(shù)組一樣,順序?qū)?yīng)paixusign char zifumax;/未壓縮的字符(互不相同);void readfile(const

47、 char* realfile)/文件讀入緩存huancunnumber=0;ifstream inputfile;inputfile.open(realfile);if(!inputfile)cout<<"no file"<<endl; long int x=0;char a;while(!inputfile.eof() a=inputfile.get();huancunhuancunnumber=a;huancunnumber+;/cout<<huancunnumber<<" "for(x=0;x<huancunnumber;x+)cout<<huancunx;cout<<endl;inputfile.close();void writefile(co

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論