文本的無損壓縮和還原(lzw 算法實現(xiàn))
原貼地址:http://www.95time.cn/bbs/newsdetail.asp?id=1470461&posts=current
你所需要具備的技術(shù)基礎(chǔ):了解 javascript 基本語法。 當(dāng)然如果學(xué)習(xí)過 vc vb 或 delphi,可以用這個原理來壓縮任何文件,gif 也是基于這個算法 lzw 壓縮原理: 為了簡化問題,下面用的是偽代碼:
1.首先初始化一個“字典”,“字典”里包含了 128 個 ASC II 碼。
var dictionary = new Array; for(i = 0; i < 128; i++) { dictionary[i]=String.fromCharCode(i); }
2.不斷地在輸入文件中尋找在字典中出現(xiàn)的最長的匹配p,并輸出其在字典中的位置值到目的文件。若輸入文件中下一個字符為c,把pc插入字典。 StringInDictionary = input_first_char();
while( ! AtEndOfFile ) {
if( search_dictionary(StringInDictionary) ) != null) { CodeInDictionary = search_dictionary(StringInDictionary);
NextChar = input_next_char(); StringInDictionary += NextChar; } else { Output(CodeInDictionary); dictionary[dictionary.length] = StringInDictionary; StringInDictionary = NextChar; } }
/*在字典里搜索特定字符串*/
function search_dictionary(str) { for( i = 0; i < dictionary.length; i ++ ) { if( dictionary[i] == str ) return i; }
return null; }
這樣就得到了壓縮文件。 可以看出,壓縮文件里并沒有包含字典,事實上,解壓縮時字典是可以根據(jù)壓縮文件里的內(nèi)容重建的。 下面我們來看一下解壓縮的代碼:
var dictionary = new Array; for(i = 0; i < 128; i++) { dictionary[i] = String.fromCharCode(i); }
previous_code = ReadFirstCode(); OutPutString = dictionary[previous_code]; Output(OutPutString);
while( ! AtEndOfFile ) { current_code = ReadNextCode(); OutPutString = dictionary[current_code]; Output(OutPutString); dictionary[dictionary.length] = dictionary[previous_code] + OutPutString.substr(0, 1); previous_code = current_code; }
如果你看懂了上面的偽代碼,一定會覺得這十分簡單,確實,即使把偽代碼改寫成真實的代碼,并解決其中的一些細節(jié)問題,對大多數(shù)有一定編程經(jīng)驗的朋友來說,只是工作量的問題而已。如果學(xué)習(xí)過 vc vb 或 delphi,可以用這個原理來壓縮任何文件,gif 也是基于這樣的原理,只不過字典初始化時不是存儲 ASC II 碼,而是 256 種(或更少)預(yù)定義的顏色值。對于通用文件壓縮,字典初始化時存儲一個字節(jié)的所有可能的取值(0 到 255)。
實現(xiàn)的例子1: (用了 fso ,要拷到本地運行的。由于 javascript 不支持二進制流讀寫,而且字符編碼是 unicode 的,所以這個程序只支持 unicode 格式的英文文本文件的壓縮和解壓。)
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
出處:藍色理想
責(zé)任編輯:帥青蛙
上一頁 下一頁 文本的無損壓縮和還原 [2]
◎進入論壇網(wǎng)頁制作、網(wǎng)站綜合版塊參加討論
|