專利名稱:適合數(shù)據(jù)壓縮的方法和設(shè)置的制作方法
背景技術(shù):
數(shù)據(jù)壓縮是指縮減表達(dá)已知信息所需數(shù)據(jù)量的過程??s減過程的基礎(chǔ)是除去冗余或不必要的數(shù)據(jù)。數(shù)據(jù)壓縮技術(shù)可以降低信息存儲(chǔ)及信息傳輸?shù)馁M(fèi)用。數(shù)據(jù)壓縮技術(shù)被用于許多方面,從簡(jiǎn)單的文件縮小到語音及視頻信號(hào)的編碼都可用到數(shù)據(jù)壓縮技術(shù)。
數(shù)據(jù)壓縮分為二種類型無損壓縮和有損壓縮。在無損壓縮中,在編碼器輸入的源信息會(huì)在解碼器的輸出中進(jìn)行嚴(yán)格的檢索。在有損壓縮中,信息不進(jìn)行嚴(yán)格的檢索,但損失的信息量對(duì)于使用這種壓縮技術(shù)的情況而言是可以接受的。有損壓縮主要用于語言、音頻、圖像及視頻信號(hào)的壓縮。壓縮算法的目的在于使用最少量的字節(jié)數(shù)來表達(dá)信號(hào),同時(shí)又可保持這一信號(hào)可被解讀和感知。所有人類感官不能察覺的信息都可以被除去。
無損失壓縮技術(shù)用應(yīng)用的情況于不允許有信息損失,例如用于壓縮可執(zhí)行文件、源代碼文件、衛(wèi)星圖像以及醫(yī)療成像。無損壓縮技術(shù)也會(huì)在有損壓縮方案中得到部分應(yīng)用,以期得到更佳的壓縮比。
一項(xiàng)用于無損壓縮的著名技術(shù)就是LZW算法,LZW算法是一項(xiàng)通用算法,該算法的基礎(chǔ)是根據(jù)固定規(guī)則對(duì)字符串進(jìn)行解析。該算法基于一個(gè)概念,這個(gè)概念就是經(jīng)常使用的序列可以使用比表達(dá)整個(gè)序列所需數(shù)量更少的字節(jié)進(jìn)行編碼。LZW算法需要對(duì)帶有源字符的表格進(jìn)行初始化處理。在起動(dòng)編碼過程之前,符號(hào)的寬度要被選定,符號(hào)的源字符被生成并被存儲(chǔ)在編碼器和解碼器的編碼表格中。當(dāng)對(duì)收到的符號(hào)序列進(jìn)行編碼時(shí),LZW算法將選定的符號(hào)(詞匯)序列添加到代碼庫時(shí),代碼庫中含有的序列可以用少于表達(dá)整個(gè)序列所需數(shù)量的字節(jié)進(jìn)行編碼。源字符的大小與符號(hào)的寬度無關(guān)。舉例而言,寬度為1比特(8個(gè)字節(jié))的符號(hào)需要28(256)輸入的源字符,寬度為2比特(16字節(jié))的符號(hào)需要216(64K)輸入的源字符。一般而言,LZW算法用于寬度為1比特的符號(hào)。LZW算法對(duì)編碼表進(jìn)行搜索以便找到與所收到的符號(hào)序列相配的最長(zhǎng)源字符,并將代碼庫中存儲(chǔ)的與符號(hào)串相配的最長(zhǎng)源字符索引發(fā)送出去。
圖1表明的是執(zhí)行無損數(shù)據(jù)壓縮的編碼器和解碼器中所用到的以往LZW算法的編碼表100。這一LZW編碼表可能是一個(gè)三元可設(shè)定地址的內(nèi)存。編碼器使用存儲(chǔ)在LZW編碼表100中的源字符106和代碼庫108對(duì)輸入的符號(hào)序列102編譯成索引值序列。編碼器110中的編碼表100和解碼器112中的解碼表120含有源字符106和代碼庫108。索引序列114由編碼器110傳輸出去,并由解碼器112進(jìn)行解碼。解碼器112輸出的字符串104與輸入的符號(hào)序列102具有相同的符號(hào)。在編碼器110開始對(duì)輸入的符號(hào)序列102進(jìn)行編碼之前,源字符106被存儲(chǔ)于編碼器110和解碼器112的LZW編碼表100中。從編碼器110發(fā)送至解碼器112的索引序列114或者是存儲(chǔ)在源字符106中的無格式文本符號(hào),或者是存儲(chǔ)在代碼庫108中的符號(hào)串索引。編碼器110和解碼器112通過依據(jù)初始的源字符來獲悉新的符號(hào)序列,并由此在各自的代碼庫中獨(dú)立地創(chuàng)建輸入項(xiàng)。編碼器110在代碼庫中添加入新的符號(hào)序列,并將以前獲悉符號(hào)或符號(hào)序列的索引以索引序列114這一形式發(fā)送給解碼器112。解碼器同樣獲悉新的字符串,并將新的字符串存儲(chǔ)在代碼表108中LZW解碼表120的新索引位置上。
圖2表明的是以前的LZW技術(shù)對(duì)圖1所示的編碼器輸入的字符串進(jìn)行壓縮的過程。在編碼器110開始對(duì)輸入的字符串進(jìn)行解析或解碼器開始解碼之前,源字符106被存儲(chǔ)在LZW編碼表100中。在編碼表100和解碼表120中,8位字符所用的源字符106存儲(chǔ)在索引0~255的位置上。源字符106中256地址的5項(xiàng)內(nèi)容被顯示出來。符號(hào)“/”存儲(chǔ)在索引47的位置上,符號(hào)“b”存儲(chǔ)在索引98的位置上,符號(hào)“d”存儲(chǔ)在索引100的位置上,符號(hào)“e”存儲(chǔ)在索引101的位置上,符號(hào)“t”存儲(chǔ)在索引116的位置上,符號(hào)“w”在座在索引119的位置上。LZW編碼表100中源字符106的索引256位置上的另一輸入項(xiàng)256存儲(chǔ)著字符串結(jié)束碼,LZW編碼表100中代碼庫108的索引257位置上的輸入項(xiàng)257存儲(chǔ)著溢出碼。
輸入的字符串102被編碼器110所接收。編碼器110對(duì)輸入的字符序列102進(jìn)行解析,并發(fā)送出索引序列114。編碼器110通過對(duì)輸入的字符序列102進(jìn)行解析并通過在LZW編碼表100中搜尋與這一字符序列相匹配的最長(zhǎng)對(duì)應(yīng)碼來對(duì)字符序列102進(jìn)行編碼。輸入的字符序列102作為索引序列被發(fā)送出去,用于LZW編碼表100的輸入。索引可以是源字符106或代碼庫108中某一輸入項(xiàng)的指示符。
正如LZW編碼表100所示的,存儲(chǔ)有符號(hào)“/”的源字符106中輸入項(xiàng)的索引為47。編碼表100最初只存儲(chǔ)有源字符106。當(dāng)編碼器收到字符序列102時(shí),編碼器根據(jù)字符的寬度來對(duì)字符序列102進(jìn)行解析。編碼器選擇字符序列102中的某一字符,并在LZW編碼表100中搜尋這一字符。編碼器通過將已知的字符與該字符序列加合起來來獲悉代碼詞匯。如果這一字符被找到了,則這一字符與下一字符進(jìn)行加合,然后在LZW編碼表100中針對(duì)由這二個(gè)字符形成的字符序列進(jìn)行搜尋。如果該字符序列沒有存儲(chǔ)在LZW編碼表100中,則前一個(gè)被識(shí)別出字符的索引或字符序列的索引被發(fā)送出去,這一新的字符序列被添加到LZW編碼表100中。
使用LZW算法的編碼器操作過程可通過輸入字符序列102和寬度為一個(gè)字母(8位)的字符加以說明;如圖2所示,字符串102為“/wed/we/wee/web/wet/”。編碼表100存儲(chǔ)有初始字符,初始字符對(duì)于每個(gè)8位字符都有一個(gè)輸入項(xiàng),其中字符包括“/”、“w”、“e”、“d”、“b”和“t”。
對(duì)輸入字符序列102的解析是從符號(hào)“/”開始的,符號(hào)“/”存儲(chǔ)在LZW編碼表100中索引為47的位置上,“/”與下一個(gè)字符“w”進(jìn)行加合。編碼器會(huì)在編碼表中搜尋字符串“/w””,由于LZW編碼表100中沒有存儲(chǔ)“/w”,所以編碼器通過在下一個(gè)序列索引258存儲(chǔ)“/w”來獲悉“/w”?!?”的索引,即47這一已被識(shí)別字符的索引在索引序列104中被發(fā)送出去。
對(duì)字符序列102的解析接下來從字符“w”開始。編碼器在LZW編碼表100中搜尋字符“w”。字符“w”存儲(chǔ)在LZW編碼表100中索引為119的位置上,字符“w”與下一字符“e”進(jìn)行加合,編碼器在編碼表中搜尋字符串“we”。由于“we”并未存儲(chǔ)在編碼表100中,所以字符串“we”是通過被存儲(chǔ)在下一個(gè)序列索引259中而被獲悉的。
對(duì)字符序列102的解析接下來從字符“e”開始。字符“e”存儲(chǔ)在LZW編碼表100中索引為101的位置上,字符“ e”與輸入字符串的下一字符“d”進(jìn)行加合,編碼器在編碼表中搜尋字符串“ed”。由于“ed”并未存儲(chǔ)在編碼表100中,所以字符串“ed”是通過被存儲(chǔ)在下一個(gè)序列索引260中而被獲悉的。前一個(gè)被識(shí)別出字符“e”的索引,即101在索引序列104中被發(fā)送出去。
對(duì)字符序列102的解析接下來從字符“d”開始。字符“d”存儲(chǔ)在LZW編碼表100中索引為100的位置上,字符“d”與輸入字符串的下一字符“/”進(jìn)行加合,編碼器在編碼表中搜尋字符串“d/”。由于“d/”并未存儲(chǔ)在編碼表100中,所以字符串“d/”是通過被存儲(chǔ)在下一個(gè)序列索引261中而被獲悉的。前一個(gè)被識(shí)別出字符“d”的索引,即100在索引序列104中被發(fā)送出去。
對(duì)字符序列102的解析接下來從字符“/”開始。字符“/”存儲(chǔ)在LZW編碼表100中索引為47的位置上,字符“/”與輸入字符串的下一字符“w”進(jìn)行加合,編碼器在編碼表中搜尋字符串“/w”。由于“/w”存儲(chǔ)在編碼表100的索引258處,字符“/w”與輸入字符串102的字符“e”進(jìn)行加合,編碼器在編碼表中搜尋字符串“/we”,由于“/we”并未存儲(chǔ)在編碼表100中,所以字符串“/we”是通過被存儲(chǔ)在下一個(gè)序列索引262中而被獲悉的。前面被識(shí)別出字符串“/w”的索引,即258在索引序列104中被發(fā)送出去。
舉例而言,對(duì)于寬度為8位的字符而言,如果找到了與24位字符串“/we”相匹配的內(nèi)容,則編碼器向解碼器發(fā)送一個(gè)9位的索引(字符串“/we”存儲(chǔ)在代碼庫中的地址)。這樣就把傳遞的位數(shù)從24降到了9。在收到9位的索引后,解碼器將存儲(chǔ)在9位索引中的字符串“/we”恢復(fù)到代碼庫的拷貝中。如果代碼庫中沒有相匹配的序列,則編碼器發(fā)送單個(gè)字符“/”、“w”和“e”的索引。
發(fā)送字符串102這20個(gè)符號(hào)需要160位(20符號(hào)×8位/符號(hào))。LZW算法將發(fā)送的位數(shù)降到了126位(14索引×9位)。在輸入的字符串102被解析的同時(shí),編碼表100中代碼庫108所存儲(chǔ)的代碼詞匯在增加,存儲(chǔ)在編碼表中字符串的長(zhǎng)度也在增加。舉例而言,索引264代表著4個(gè)字符的字符串“/wee”。
存儲(chǔ)在編碼表中的字符串越大,則壓縮效果越好,因?yàn)樗鶄魉退饕臄?shù)量降低了。通過增加字符的寬度也可以改善壓縮效果。然而,字符寬度每增加1位,則LZW算法所需要的初始源字符就要增加2個(gè)。因此,對(duì)于寬度為幾個(gè)字節(jié)的字符而方言,對(duì)初始源字符進(jìn)行編碼將需要一個(gè)很大的表,以致于大到不合實(shí)用的程度。
發(fā)明概述本發(fā)明不需對(duì)代碼庫中的源字符進(jìn)行初始化處理。在本發(fā)明中,源字符和代碼詞匯是在對(duì)輸入的字符串進(jìn)行編碼過程中而被獲悉并被存儲(chǔ)到代碼庫中。
此外,在以前的LZW算法中,較大的字符需要較大的字符索引寬度。一個(gè)由256個(gè)單字節(jié)符號(hào)組成的字符需要以9位索引開始,16384個(gè)雙字節(jié)符號(hào)組成的字符需要的初始索引為17位。索引的寬度會(huì)直接影響到壓縮比。在本發(fā)明中,字符的大小對(duì)索引寬度沒有直接的影響。此外,只有被源用到的符號(hào)才被添加到代碼庫中去。因此,本發(fā)明適用于稀疏源。
對(duì)代碼庫進(jìn)行搜索,以便找出在字符串中所收到的符號(hào)或符號(hào)序列。一旦發(fā)現(xiàn)代碼庫中沒有存儲(chǔ)這一符號(hào),則通過將其存儲(chǔ)在代碼庫中來獲悉這一符號(hào),該無格式符號(hào)以編碼單詞的形式被發(fā)送出去。
一旦發(fā)現(xiàn)代碼庫中存儲(chǔ)有某一符號(hào)或符號(hào)序列,則符號(hào)或符號(hào)序列在代碼庫中所存儲(chǔ)位置的索引以編碼代碼形式被發(fā)送出去。代碼字前綴區(qū)的狀況可以表明代碼字的內(nèi)容是要被獲悉的無格式符號(hào),還是一個(gè)索引。代碼庫的索引可以根據(jù)已獲悉符號(hào)的數(shù)量或字符序列的數(shù)量而改變寬度。
符號(hào)的寬度可以根據(jù)數(shù)據(jù)的類型進(jìn)行選定。舉例而言,在文本傳輸過程中,一個(gè)單字節(jié)可方便地定義一個(gè)字母。然而,對(duì)于音頻或視頻數(shù)據(jù)而言,在符號(hào)更寬的情況下對(duì)數(shù)據(jù)流進(jìn)行解析會(huì)得到更好的壓縮效果。因?yàn)椴⒉皇撬械姆?hào)都一開始就存儲(chǔ)在代碼庫中,而是在它們出現(xiàn)時(shí)才被存儲(chǔ)起來,所以可以使用寬度大的符號(hào),而不必?fù)?dān)心內(nèi)存出現(xiàn)初始過載問題。
圖示簡(jiǎn)介通過本文下面結(jié)合所附圖示對(duì)優(yōu)選實(shí)施方案的更具體說明,可以清楚地理解前面所述的本發(fā)明的各種目的、特點(diǎn)及優(yōu)勢(shì);在不同圖形中相同的參照字符代表相同的部件。所附圖形并不一定是按比例繪制的,為了表明本發(fā)明的原理,圖形中有著重強(qiáng)調(diào)的地方。
圖1表明的是在使用以前LZW技術(shù)執(zhí)行無損數(shù)據(jù)壓縮時(shí)編碼器形成的編碼表以及解碼器形成的解碼表。
圖2表明的是以前的LZW技術(shù)對(duì)圖1所示編碼器中輸入字符串進(jìn)行的壓縮過程。
圖3表明的是根據(jù)本發(fā)明的原理進(jìn)行無損壓縮時(shí),編碼器所形成的編碼表以及解碼器所形成的解碼表。
圖4A表明的是編碼器以無格式符號(hào)方式在編碼字符串中發(fā)送出去的代碼字符,無格式符號(hào)為圖3所示的編碼器所獲悉。
圖4B表明的是某一符號(hào)在被發(fā)送的字符串中的代碼字符,該符號(hào)是已被獲悉的符號(hào),并被存儲(chǔ)在圖3所示的編碼表和解碼表中。
圖5所示的是在將輸入字符串編譯成被發(fā)送的編碼代碼時(shí),圖3所示的編碼器形成的編碼表以及控制邏輯。
圖6是流程圖,它表明了在對(duì)輸入字符串進(jìn)行編碼時(shí),圖5所示的控制邏輯所使用的方法。
圖7是流程圖,它表明了在確定索引寬度和代碼庫的狀態(tài)時(shí),圖6中步驟618所執(zhí)行的步驟。
圖8A-8B是流程圖,它表明了在對(duì)接收到的編碼字符串進(jìn)行解碼時(shí),圖3所示解碼器所使用的方法。
圖9表明的是輸入的字符串、在對(duì)輸入字符串進(jìn)行處理后編碼器代碼庫中的內(nèi)容以及編碼后的字符串。
本發(fā)明的詳細(xì)說明本發(fā)明優(yōu)選實(shí)施方案的說明如下。
圖3中含有根據(jù)本發(fā)明原則進(jìn)行無損壓縮的編碼器310以及解碼器312;編碼器含有編碼表300,解碼器含有解碼表320。編碼器310和解碼器312在代碼庫308未存儲(chǔ)初始源字符的狀態(tài)下開始編碼和解碼。當(dāng)編碼器對(duì)輸入的字符串302進(jìn)行解析時(shí),其中的字符被獲悉。輸入字符串以符號(hào)為單位被解析。符號(hào)可以是任意寬度的,例如符號(hào)可由多個(gè)字母組成。在編碼器輸出的每個(gè)編碼代碼前面會(huì)加上一個(gè)1位的前綴,這樣可使解碼器獲悉這一字符。當(dāng)編碼器310獲悉一個(gè)符號(hào)時(shí),編碼器310按無格式方式以編碼代碼的形式將這一符號(hào)發(fā)送出去,并在編碼代碼前面加上1位被指定為“0”的前綴。如果該符號(hào)為已知符號(hào),則編碼器310在發(fā)送的索引前面加上一位被指定為“1”的前綴。在本發(fā)明中,符號(hào)的寬度沒有限制,因?yàn)樵诒景l(fā)明中沒有受限于內(nèi)存容量的初始表格。字符是被動(dòng)態(tài)獲悉的。為了對(duì)編碼單詞進(jìn)行解碼,解碼器312首先要識(shí)別表明數(shù)據(jù)類型的前綴位。如果這一位的數(shù)值為“0”,則解碼器312將這一符號(hào)直接輸出。如果這一位的數(shù)值為“1”,則解碼器使用代碼庫對(duì)索引對(duì)編碼代碼進(jìn)行翻譯。
每當(dāng)有無格式符號(hào)發(fā)送到解碼器312時(shí),解碼器312便將收到的符號(hào)添加到解碼器的代碼庫308中。因此,不需要儲(chǔ)存整個(gè)源字符。而且,只有解碼器所收到的符號(hào)才被存儲(chǔ)在代碼庫308中。
編碼器310接收輸入的字符串302,并使用編碼表300中代碼庫308所存儲(chǔ)的符號(hào)或符號(hào)串來對(duì)輸入的字符串進(jìn)行壓縮,壓縮后將編碼的字符串314發(fā)送出去。在某一實(shí)施方案中,編碼字符串314可以以數(shù)據(jù)包的形式在網(wǎng)絡(luò)上進(jìn)行傳輸,并在接收地的解碼器進(jìn)行解碼。在另一實(shí)施方案中,經(jīng)編碼后的數(shù)據(jù)可以被傳送到存儲(chǔ)裝置中。
與以往的LZW算法不同,在編碼器310開始對(duì)輸入字符串302進(jìn)行解析之前,該符號(hào)的源字符并未存儲(chǔ)在編碼表300中。編碼器310是在對(duì)輸入字符串302進(jìn)行解析時(shí)獲悉該源字符和編碼代碼的。編碼器310將新獲悉的符號(hào)按無格式方式以編碼字符串314這一形式發(fā)送出去,這樣解碼器可以獲悉到源字符。
編碼器310所收到的字符串302被進(jìn)行編碼,以便去除冗余或不必要的數(shù)據(jù)。編碼器310依據(jù)所選定的符號(hào)寬度以及存儲(chǔ)在編碼表300中的代碼庫308對(duì)收到的字符串進(jìn)行編碼。經(jīng)編碼后的字符串314被發(fā)送給解碼器312。編碼后的字符串314是一串編碼單詞。每個(gè)編碼單詞都含有符號(hào)或索引,該索引與代碼庫308中儲(chǔ)存的符號(hào)串相對(duì)應(yīng)。
解碼器312從接收到的編碼字符串314獲悉源字符和代碼詞匯,并將它們存儲(chǔ)在解碼表320的代碼庫308中。解碼器312根據(jù)代碼庫308中獲悉的源字符及編碼代碼來對(duì)接收到的編碼字符串314進(jìn)行解碼,從而提供原始的字符串。
在某一實(shí)施方案中,編碼器310中的編碼表300和解碼器312中的解碼表320形成于二元或三元內(nèi)容可編地址內(nèi)存中。該內(nèi)容可編地址內(nèi)存具有搜索和學(xué)習(xí)功能。如果在內(nèi)容可編地址內(nèi)存中沒有搜索索引存在,則搜索和學(xué)習(xí)功能可以使內(nèi)容可編地址內(nèi)存獲得搜索索引。如果在內(nèi)容可編地址內(nèi)存的輸入項(xiàng)中存儲(chǔ)有搜索索引,則內(nèi)容可編地址內(nèi)存返回到與搜索索引相對(duì)應(yīng)的地址。如果在內(nèi)容可編地址內(nèi)存的輸入項(xiàng)中沒存儲(chǔ)搜索索引,則內(nèi)容可編地址內(nèi)存通過將新的搜索索引存儲(chǔ)在內(nèi)容可編地址內(nèi)存的輸入項(xiàng)中來獲悉一個(gè)新的搜索索引。
編碼表300和解碼表320使用二個(gè)輸入項(xiàng)進(jìn)行初始化處理,這二項(xiàng)輸入為字符串結(jié)束316和溢出碼318。當(dāng)發(fā)送溢出碼318的索引時(shí),則表示編碼表300已滿。當(dāng)編碼表300已滿時(shí),除字符串結(jié)束和溢出碼外,其余所有的輸入均被清除,當(dāng)收到字符串時(shí),字符和編碼代碼再被重新獲悉。溢出碼被發(fā)送給解碼器,這樣解碼器312可以對(duì)其解碼表320進(jìn)行初始化處理。編碼表300的初始化處理將在下面結(jié)合圖6進(jìn)行說明。字符串結(jié)束這一輸入項(xiàng)的索引在編碼過程結(jié)束時(shí)被發(fā)送出去。
由于不需要初始源字符,所以符號(hào)的寬度不再受到來自于存儲(chǔ)初始源字符所需的內(nèi)存的限制,此外,初始索引的寬度也不再受到源字符大小的影響。因?yàn)榉?hào)是通過編碼字符串312發(fā)送的,這可使解碼器312獲悉新的字符,所以在編碼過程中可以對(duì)符號(hào)的寬度進(jìn)行修改。在編碼過程中可以對(duì)壓縮比進(jìn)行監(jiān)測(cè),為了提高壓縮比可以適當(dāng)修改符號(hào)的寬度。舉例而言,在互聯(lián)網(wǎng)上進(jìn)行數(shù)據(jù)交換時(shí),被壓縮數(shù)據(jù)的類型可轉(zhuǎn)換成用戶所需的數(shù)據(jù)類型。舉例而言,用戶所需的文件類型可從音頻文件轉(zhuǎn)變成圖像文件,然后再轉(zhuǎn)成文本文件。在本發(fā)明中符號(hào)的寬度可隨被傳送文件類型的變化而變化,這樣對(duì)于所收到的特定字符串而言,符號(hào)的寬度可以進(jìn)行優(yōu)化選擇。同樣,較大的符號(hào),如在一幅圖像中一個(gè)4×4像素塊(16字節(jié))可在無需較大存儲(chǔ)初始源字符的內(nèi)存情況下被壓縮。
符號(hào)的最大寬度取決于編碼表300和解碼表320的物理寬度。舉例而言,一個(gè)7字節(jié)(56位)的符號(hào)可以存儲(chǔ)在一個(gè)72位寬的內(nèi)容可編地址內(nèi)存中。72位寬的內(nèi)容可編地址內(nèi)存提供56位(7字節(jié))來存儲(chǔ)這一符號(hào),再提供14位來存儲(chǔ)另一內(nèi)容可編地址內(nèi)存輸入的索引。144位的內(nèi)容可編地址內(nèi)存可以存儲(chǔ)更寬的符號(hào)。從編碼器310發(fā)送到解碼器312的編碼字符串314中編碼單詞的格式將結(jié)合圖4A-4B進(jìn)行說明。
在另一實(shí)施方案中,編碼器310和解碼器312可以作為指令存儲(chǔ)在內(nèi)存中并由處理器執(zhí)行。
圖4A表明的是編碼字符串314的編碼代碼,編碼字符串314是圖3所示的編碼器310在發(fā)送所獲悉的無格式符號(hào)時(shí)發(fā)送出去的。當(dāng)編碼器310通過將無格式符號(hào)存儲(chǔ)在編碼表300中而獲悉一個(gè)新的符號(hào)時(shí),編碼器310按無格式方式以編碼字符串314的形式將這一符號(hào)傳送給解碼器312。該符號(hào)以存儲(chǔ)在無格式符號(hào)區(qū)406中的無格式方式被傳送出去。無格式符號(hào)區(qū)406的前面有一個(gè)前綴位404。前綴位404被定為“0”以表明后面跟著的是無格式符號(hào)。舉例而言,如果符號(hào)的寬度為2字節(jié),且被獲悉的符號(hào)為“/w”,則“/w”存儲(chǔ)在無格式符號(hào)區(qū)406中,“0”被存儲(chǔ)在前綴位404中。
圖4B表明的是編碼字符串314中的編碼代碼,這里的編碼字符串314是編碼器在發(fā)送已知的符號(hào)或字符串時(shí)發(fā)送出去的;這些已知的符號(hào)或字符串存儲(chǔ)在圖3所示的編碼表300中。編碼單詞包括表格索引區(qū)408,該索引區(qū)前面有前綴位。表格索引存儲(chǔ)在表格索引區(qū)408中,在表格索引區(qū)408之前是被指定為“ 1”的前綴位。表格索引區(qū)408存儲(chǔ)著該輸入項(xiàng)的索引,輸入項(xiàng)存儲(chǔ)著編碼表300和解碼表320中的符號(hào)或字符串。
表格索引區(qū)408的寬度是依據(jù)編碼表300和解碼表320中存儲(chǔ)的輸入項(xiàng)數(shù)量而變化的。舉例而言,如果編碼表300和解碼表320存儲(chǔ)的輸入少于4個(gè),則表格索引區(qū)408的寬度為2位。如果編碼表300和解碼表320存儲(chǔ)的輸入在128至255之間,則表格索引區(qū)408的寬度為8位。
圖5表明的是控制邏輯500以及圖3所示的編碼器在將輸入字符串502編譯為編碼字符串314時(shí)所用的編碼表300??刂七壿?00對(duì)輸入字符串502進(jìn)行解析以生成編碼字符串314??刂七壿嬎l(fā)送的編碼字符串314含有編碼單詞,編碼單詞含有無格式符號(hào)或表格索引;無格式符號(hào)存儲(chǔ)在無格式符號(hào)區(qū)406中,無格式符號(hào)區(qū)406前面的前綴位404被定為“0”,表格索引存儲(chǔ)在表格索引區(qū)408中,表格索引區(qū)408前面的前綴位404被定為“ 1”。
輸入字符串502含有多個(gè)符號(hào)。符號(hào)的寬度是可變的,符號(hào)可以是單字母或單字節(jié)(8位),或多字節(jié)的。符號(hào)的寬度可以根據(jù)輸入字符串502中數(shù)據(jù)的類型而動(dòng)態(tài)地進(jìn)行改變。舉例而言,如果正在處理的是文本文件,則符號(hào)寬度可選定為一個(gè)字母(8位)。如果正在處理的是圖像文件,則符號(hào)寬度可以是16字節(jié)。控制邏輯500依據(jù)所選定的符號(hào)寬度來對(duì)輸入字符串502進(jìn)行解析。
符號(hào)的寬度是可以動(dòng)態(tài)變化的。編碼器310可以對(duì)壓縮比(輸入位數(shù)/輸出位數(shù))進(jìn)行監(jiān)測(cè),如果這一比值低或突然下降,則控制邏輯500所執(zhí)行的壓縮算法可動(dòng)態(tài)地試用不同的符號(hào)寬度并選定具有最佳壓縮比的寬度。舉例而言,對(duì)于壓縮比要設(shè)定某些閾值,當(dāng)壓縮比達(dá)到閾值水平時(shí),符號(hào)的寬度就要改變,并且對(duì)符號(hào)的寬度進(jìn)行試用。符號(hào)寬度改變時(shí)的代碼要保存下來,且編碼器310和解碼器312之間要達(dá)成約定,這樣解碼器312才會(huì)識(shí)別出新的符號(hào)寬度。
此外,每當(dāng)編碼器310改變符號(hào)寬度時(shí),編碼器會(huì)在新的符號(hào)寬度之后發(fā)送一個(gè)特定保留的代碼(不為代碼庫中字符串所使用的代碼)。
改變符號(hào)寬度的一種方法是清空整個(gè)編碼表300并重新獲悉具有新寬度的符號(hào)。如果新的符號(hào)寬度可以立即給出高的壓縮比,則這種方法是有效的。但如果新寬度不適合于輸入字符串502(圖5)中數(shù)據(jù)的類型,則這種改變符號(hào)寬度的方法可能具有損害性。
另一種可用的方法是清除代碼庫308中的一部分,例如將不具有多個(gè)新符號(hào)寬度的字符串除去。這是一種中間方案,因?yàn)樾碌姆?hào)寬度會(huì)從代碼庫308(圖3)中已獲悉的字符串開始。
控制邏輯500包括字符串寄存器512、輸入字符串指針514、索引精密度寄存器516、當(dāng)前字符串長(zhǎng)度寄存器518、輸入數(shù)量寄存器520和最終添加長(zhǎng)度寄存器522??刂七壿?00使用字符串寄存器512和輸入字符串指針514來對(duì)輸入字符串502進(jìn)行解析,并使用索引精密度寄存器516來追蹤編碼字符串314所發(fā)送的編碼代碼中表格索引區(qū)408要發(fā)送的位數(shù)。字符串寄存器512被用來存儲(chǔ)搜索索引,輸入字符串指針514被用來存儲(chǔ)當(dāng)前正在為控制邏輯500(圖5)所處理的輸入字符串502中符號(hào)的指針。
輸入寄存器520的數(shù)量每當(dāng)符號(hào)或字符串被添加到代碼庫308中時(shí)便會(huì)增加。編碼器310會(huì)對(duì)輸入寄存器520的數(shù)量進(jìn)行監(jiān)測(cè)以便檢查代碼庫308是否已滿。一旦檢查到代碼庫308已滿,則編碼器310清空其代碼庫308,并將溢出碼發(fā)送給解碼器,這樣解碼器也會(huì)清空它的代碼庫308(圖3)。
最新添加長(zhǎng)度寄存器522中的內(nèi)容被用來對(duì)字符串的長(zhǎng)度進(jìn)行追蹤,被追蹤的字符串是最新添加到代碼庫308中去的。如果該寄存器被定為“1”,則有一個(gè)符號(hào)新添加到代碼庫308中。當(dāng)前字符串寄存器518中的長(zhǎng)度內(nèi)容是從輸入字符串502提取的符號(hào)數(shù)量,輸入字符串502目前被用作為搜索索引。
編碼表300中的代碼庫308使用二項(xiàng)輸入進(jìn)行初始化,這二項(xiàng)輸入是處于“0”索引的字符串結(jié)束碼和處于“1”索引的溢出碼,處于索引“3”的符號(hào)寬度變化項(xiàng)可在需要?jiǎng)討B(tài)變化符號(hào)寬度時(shí)對(duì)符號(hào)的寬度進(jìn)行動(dòng)態(tài)改變。字符串結(jié)束碼和溢出碼已結(jié)合圖3進(jìn)行了說明??刂七壿?00選擇輸入字符串502中的第一個(gè)符號(hào),并將該符號(hào)作為搜索索引504連同指令組506中的“搜索和獲悉”指令一同發(fā)送給編碼表300。編碼表300對(duì)編碼表300中代碼庫308輸入項(xiàng)所存儲(chǔ)的搜索索引504進(jìn)行搜索。
如果第一個(gè)符號(hào)沒有存儲(chǔ)在代碼庫308中,則編碼表300通過獲悉508表明編碼表正在通過將搜索索引504存儲(chǔ)在代碼庫308中來獲悉搜索索引504??刂七壿?00對(duì)獲悉項(xiàng)508進(jìn)行監(jiān)測(cè),一旦發(fā)現(xiàn)編碼表300正在獲悉搜索索引504,則控制邏輯500將這一符號(hào)作為無格式符號(hào)以編碼代碼的形式發(fā)送出去,正如前面結(jié)合圖4A所說明的,無格式符號(hào)位于無格式符號(hào)區(qū)406中,其前面的前綴位404被設(shè)定為“0”。解碼器312發(fā)現(xiàn)前綴位404被設(shè)為“0”后,解碼器312通過將代碼庫308中無格式符號(hào)區(qū)406存儲(chǔ)的該無格式符號(hào)存儲(chǔ)在解碼表320下一個(gè)序列索引中來獲悉這一符號(hào)。如果編碼表300找到了與搜索索引相匹配的項(xiàng),則相配項(xiàng)的索引510被發(fā)送給控制邏輯500。如果找到了搜索索引504的相配項(xiàng),則編碼器310在代碼庫308中搜尋與該搜索索引相配的更長(zhǎng)的符號(hào)串??刂七壿?00將當(dāng)前符號(hào)與輸入字符串502的下一個(gè)符號(hào)加合起來;以此給出下一個(gè)搜索索引504。如果沒有找到這一搜索索引,則通過將這一字符串(當(dāng)前符號(hào)加下一個(gè)符號(hào))存儲(chǔ)在編碼表300中來獲悉該搜索索引。
與在語言中將字母組合起來而學(xué)習(xí)詞匯一樣,這樣可以獲悉字符串。最長(zhǎng)前綴相配索引在編碼字符串314中發(fā)送出去,編碼字符串314存儲(chǔ)在表格索引區(qū)408(圖4B)中,其前面的前綴位404被設(shè)定為“1”。這種獲悉字符串的方法將在以下結(jié)合圖9進(jìn)行說明。
控制邏輯500根據(jù)所選定的符號(hào)寬度對(duì)輸入字符串502進(jìn)行解析。編碼表300最初只存儲(chǔ)有3個(gè)輸入項(xiàng),即字符串結(jié)束、溢出碼以及字符寬度變化碼;其中字符寬度變化碼是一可選的輸入項(xiàng)??刂七壿?00選擇輸入字符串中的下一個(gè)符號(hào),并在編碼表300搜尋這一符號(hào)。如果找到了這一符號(hào),則控制邏輯500將該符號(hào)與輸入字符串502中的下一個(gè)符號(hào)加合起來??刂七壿嫴粩嗟貙⑤斎胱址械姆?hào)加合起來,直至找到一個(gè)當(dāng)前在編碼表300中未存儲(chǔ)的符號(hào)串??刂七壿?00將相配的最長(zhǎng)符號(hào)串索引發(fā)送出去,并在該索引前加上被設(shè)定為“1”的前綴位。
如果某一符號(hào)沒有存儲(chǔ)在編碼表300中,則控制邏輯500將這一符號(hào)的無格式符號(hào)發(fā)送出去,并在其前面加上被設(shè)定為“0”的前綴,這樣解碼器312(圖5)便可獲悉這一符號(hào)。
當(dāng)符號(hào)以及符號(hào)串存儲(chǔ)在編碼表300中時(shí),控制邏輯500對(duì)輸入的數(shù)量進(jìn)行監(jiān)測(cè)。每當(dāng)輸入的數(shù)量超過了2的冪次,則控制邏輯500便增加索引的寬度??刂七壿?00還對(duì)編碼表300所用的輸入項(xiàng)數(shù)量進(jìn)行監(jiān)測(cè),從而確定編碼表300是否已滿。一旦發(fā)現(xiàn)編碼表300已滿,則控制邏輯500通過清除所有存儲(chǔ)符號(hào)的輸入項(xiàng)以及符號(hào)串來對(duì)編碼表300進(jìn)行初始化,并向解碼器312發(fā)送一個(gè)溢出碼,這樣解碼器312便可以對(duì)其解碼表320進(jìn)行初始化處理。
另外,控制邏輯500可以對(duì)壓縮比進(jìn)行監(jiān)測(cè),并且決定在有效壓縮情況下不對(duì)編碼表300進(jìn)行初始化。K.Ouaissa等人的“LZW數(shù)據(jù)壓縮過程中代碼庫大小的適應(yīng)性限制”一文對(duì)監(jiān)測(cè)壓縮比的方法進(jìn)行了說明,該文章于1995年9月在加拿大舉行的IEEE國(guó)際信息理論演討會(huì)上發(fā)表,該文章在此通過引證被并入本文。
圖6表明的是圖5所示的控制邏輯在對(duì)輸入字符串502進(jìn)行編碼時(shí)所用方法的流程。圖6將結(jié)合圖5進(jìn)行說明。
在步驟600,編碼表300進(jìn)行初始化,控制邏輯500被加以執(zhí)行。通過將字符串結(jié)束碼“0”存儲(chǔ)在索引“0”的第一項(xiàng)輸入上,并將溢出碼“1”存儲(chǔ)在索引“1”的第二項(xiàng)輸入上或者將寬度變化碼存儲(chǔ)在索引“2”上來對(duì)代碼庫進(jìn)行初始化處理;將寬度變化碼存儲(chǔ)在索引“2”上是一可選操作步驟。為簡(jiǎn)化本文中的說明,結(jié)合圖6進(jìn)行說明的實(shí)施方案并不執(zhí)行寬度改變碼。在這一實(shí)施方案中,符號(hào)的寬度是固定不變的。索引精密度寄存器516被設(shè)定為“1”,當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”,存儲(chǔ)在代碼庫中輸入520的數(shù)量被設(shè)定為2,這里沒有符號(hào)寬度變化碼,最新添加長(zhǎng)度522被設(shè)定為“1”,對(duì)于字符串502中第一字符的索引而言,輸入字符串指針514被設(shè)定為“0”,字符串寄存器512被設(shè)為空置(無字符)。過程接下來繼續(xù)執(zhí)行步驟601。
在步驟601,控制邏輯選取輸入字符串502中的下一個(gè)符號(hào),并將這一符號(hào)與字符串寄存器512中存儲(chǔ)的符號(hào)相加合,或者將所選取的符號(hào)添加到空的字符串寄存器512中,接下來繼續(xù)執(zhí)行步驟602。
在步驟602,控制邏輯500通過將字符串寄存器512中的內(nèi)容作為搜索索引504發(fā)送給編碼表300來在代碼庫中搜索與字符串寄存器512中內(nèi)容相匹配的輸入項(xiàng)??刂七壿?00同樣在指令組506中發(fā)送一條“搜索并獲悉”的指令。接下來繼續(xù)執(zhí)行步驟604。
在步驟604,控制邏輯500對(duì)獲悉項(xiàng)508的狀態(tài)進(jìn)行監(jiān)測(cè)以便確定搜索索引是否正在被獲悉,因?yàn)樗阉魉饕龥]有存儲(chǔ)在編碼表300中。如果獲悉項(xiàng)508的狀態(tài)表明搜索索引正在被獲斷悉,則繼續(xù)執(zhí)行步驟606。如果找到了搜索索引504,則繼續(xù)執(zhí)行步驟620。
在步驟606,編碼表300中沒有找到搜索索引504。搜索索引504被存儲(chǔ)在編碼表300的下一個(gè)索引位置上。過程接下來繼續(xù)執(zhí)行步驟608。
在步驟608,控制邏輯500根據(jù)存儲(chǔ)在當(dāng)前字符串長(zhǎng)度518中的數(shù)值來檢查存儲(chǔ)在字符串寄存器512中符號(hào)的數(shù)量。如果當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”,則過程繼續(xù)執(zhí)行步驟610,將這一符號(hào)以無格式方式發(fā)送出去。如果當(dāng)前字符串長(zhǎng)度518中的內(nèi)容大于1,這表明字符串寄存器512中存儲(chǔ)的符號(hào)在1個(gè)以上,過程接下來繼續(xù)執(zhí)行步驟612。
在步驟610,控制邏輯500按照結(jié)合圖4A所說明的過程將字符串寄存器512中存儲(chǔ)的無格式符號(hào)發(fā)送出去,并在這一符號(hào)前加上被設(shè)定為“0”的前綴位404。過程接下來繼續(xù)執(zhí)行步驟616。
在步驟612,控制邏輯500對(duì)最新添加長(zhǎng)度項(xiàng)522進(jìn)行檢查以確定最新添加到代碼庫308中的字符串長(zhǎng)度。如果最新存儲(chǔ)的字符串長(zhǎng)度為“1”,即一個(gè)符號(hào),則過程繼續(xù)執(zhí)行步驟616;如果不是,則過程繼續(xù)執(zhí)行步驟614。
在步驟614,控制邏輯500按結(jié)合圖4B所說明的將表格索引區(qū)408中前一個(gè)相配字符串的索引發(fā)送出去,這一索引前面的前綴位404被設(shè)定為“1”。這一字符串是已知的,因此,前一個(gè)被識(shí)別符號(hào)串的索引被發(fā)送出去。過程接下來繼續(xù)執(zhí)行步驟616。
在步驟616,控制邏輯500確定最新的添加到當(dāng)前字符串長(zhǎng)度518中內(nèi)容的長(zhǎng)度522。當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”。過程接下來繼續(xù)執(zhí)行步驟617。
在步驟617,控制邏輯500將字符串寄存器設(shè)為空置。過程接下來繼續(xù)執(zhí)行步驟618。
在步驟618,控制邏輯500檢查編碼表300中的代碼庫308是否已滿??刂七壿?00還檢查索引精密度寄存器516是否應(yīng)該增長(zhǎng)。步驟618將在下文中結(jié)合圖7進(jìn)行說明。
在步驟620,控制邏輯500將輸入字符串指針514推進(jìn)到輸入字符串502的下一個(gè)字符。過程接下來繼續(xù)執(zhí)行步驟621。
在步驟621,控制邏輯500增加當(dāng)前字符串長(zhǎng)度518中存儲(chǔ)的符號(hào)數(shù)量。過程接下來繼續(xù)執(zhí)行步驟622。
在步驟622,控制邏輯500確定輸入字符串502是否有更多的符號(hào)要編碼。如果字符串指針沒有指向字符串結(jié)束碼,則有更多的符號(hào)需要解碼。如果有有效符號(hào),則過程繼續(xù)執(zhí)行步驟601。如果指針指向字符串結(jié)束碼,則過程繼續(xù)執(zhí)行步驟624。
在步驟624,控制邏輯500完成了對(duì)輸入字符串502的編碼。如果該字符串存在于代碼庫308中,則控制邏輯傳送這一字符串的索引,排在編碼字符串314前面的前綴位404被設(shè)定為“1”。過程至此全部完成。控制邏輯500發(fā)送字符串結(jié)束項(xiàng)代碼“1”,如果該字符串存儲(chǔ)有字符串結(jié)束項(xiàng),則編碼字符串314的前綴位404被設(shè)定為“1”。
如果輸入字符串502的壓縮不是具有多種符號(hào)寬度的,則編碼器310向解碼器312發(fā)送一個(gè)特定的代碼,該代碼后面跟著的是符號(hào)中剩余的位數(shù),后面再跟著的是無格式符號(hào)。舉例而言,如果輸入字符串是“123456789”,且符號(hào)寬度為二個(gè)字符,則解析邊界為12、34、56、78、9。因此,最后的字符>9=是一個(gè)部分符號(hào)。因此,“9”以1.特定代碼.9(8位).8(要解析的位數(shù))這一形式被發(fā)送出去。
圖7是流程圖,它表明了圖6中步驟618所執(zhí)行的步驟,該步驟用來確定存儲(chǔ)于索引精密度寄存器516中的當(dāng)前索引寬度是否要增加。圖7還表明了在代碼庫308已滿時(shí)編碼表300的重新初始化步驟。
如果代碼庫308已滿,則會(huì)有一個(gè)溢出碼發(fā)送到解碼器312,這表明應(yīng)執(zhí)行清除操作。清除操作會(huì)清除掉編碼表300中的所有輸入項(xiàng),并通過將字符串結(jié)束這一項(xiàng)存儲(chǔ)在索引“0”位置上以及將溢出碼存儲(chǔ)在索引“1”位置同時(shí)將索引寬度初始設(shè)定為“1”來對(duì)編碼表300進(jìn)行重新初始化處理。每當(dāng)存儲(chǔ)于編碼表300中的輸入項(xiàng)數(shù)量跨越2的冪次一次,索引寬度便增長(zhǎng)1位。
在步驟700,控制邏輯500從輸入項(xiàng)數(shù)量項(xiàng)520中的內(nèi)容確定代碼庫308是否已滿。如果代碼庫308已滿,則過程繼續(xù)執(zhí)行步驟706。如果不滿,則過程繼續(xù)執(zhí)行步驟702。
在步驟702,控制邏輯500確定編碼表300中輸入數(shù)量項(xiàng)520中的內(nèi)容,并確定編碼表300中的輸入項(xiàng)數(shù)量是否達(dá)到了2的冪次。索引的寬度起始時(shí)為1位,每當(dāng)編碼表300中最新存儲(chǔ)輸入項(xiàng)的索引達(dá)到2的冪次時(shí),索引的寬度便增加。舉例而言,當(dāng)代碼庫存儲(chǔ)的輸入項(xiàng)少于23時(shí),則索引精密度寄存器516對(duì)一個(gè)三位寬的索引存儲(chǔ)3,當(dāng)存儲(chǔ)8個(gè)輸入項(xiàng)時(shí),索引的寬度從3增加到4。如果編碼表300達(dá)到2的冪次時(shí),過程繼續(xù)執(zhí)行步驟704。如果沒有達(dá)到這一冪次,則過程繼續(xù)執(zhí)行步驟622。
在步驟704,編碼表300達(dá)到2的冪次,索引精密度寄存器516被增加。索引精密度寄存器516表明有多少位在表格索引區(qū)408中被傳遞出去。過程接下來執(zhí)行步驟622。
在步驟706,代碼庫308已滿。控制邏輯500將存儲(chǔ)在代碼庫308第二項(xiàng)輸入中的溢出碼發(fā)送出去。溢出碼在編碼字符串314中被發(fā)送出去,這樣解碼器312會(huì)知道編碼表300正在被清空,解碼器312也會(huì)清空解碼器312的代碼庫308。過程接下來繼續(xù)執(zhí)行步驟708。
在步驟708,編碼表300中的所有表格輸入被清空。過程接下來繼續(xù)執(zhí)行步驟710。
在步驟710,編碼表300被初始化。在不選擇符號(hào)的寬度可以變化的情況下代碼庫308是通過在索引“0”的第1輸入項(xiàng)上存儲(chǔ)“0”并在索引“1”的第二輸入項(xiàng)上存儲(chǔ)“1”而進(jìn)行初始化的。索引精密度寄存器516被設(shè)定為1,存儲(chǔ)于代碼庫308中的輸入數(shù)量520被設(shè)定為2,最新添加長(zhǎng)度522被設(shè)定為“1”,輸入字符串指針514被設(shè)定為當(dāng)前符號(hào)中這一位置的索引。過程接下來繼續(xù)執(zhí)行步驟622。
圖8A一8B是流程圖,它表明了圖3所示解碼器312在對(duì)所收到的編碼字符串314進(jìn)行解碼時(shí)所使用的方法。為了對(duì)接收到的編碼代碼進(jìn)行解碼,解碼器312含有多個(gè)寄存器。寄存器包括用于存儲(chǔ)最新解碼字符串索引的舊索引寄存器,還包括用于存儲(chǔ)索引的新索引寄存器以及用于存儲(chǔ)當(dāng)前解碼字符串(無格式)和某一符號(hào)的解碼字符串寄存器;解碼字符串寄存器中所存儲(chǔ)的這一符號(hào)與當(dāng)前解碼字符串的第一個(gè)符號(hào)是相等的。
解碼器312對(duì)所收到的第一位進(jìn)行檢查以確定所收到的是一個(gè)符號(hào)還是一個(gè)索引。解碼器使用存儲(chǔ)于解碼表320中的已知符號(hào)串來替代索引,從而實(shí)現(xiàn)對(duì)收到索引的解碼。解碼器312通過將無格式符號(hào)存儲(chǔ)在解碼表320中的下一順序索引位置上來獲悉所收到的無格式符號(hào)。
在步驟800,解碼器312從編碼字符串314中選取第1位。在不選擇符號(hào)寬度可以變動(dòng)的情況下,解碼器中代碼庫308最初只存儲(chǔ)有二項(xiàng)輸入。解碼器312從所收到的編碼字符串314中獲悉符號(hào),并將符號(hào)填充到代碼庫308中。解碼器312所收到的第1個(gè)編碼字符串314的第1位表明了第一個(gè)編碼代碼包括無格式符號(hào)區(qū)406,該無格式符號(hào)區(qū)存儲(chǔ)有解碼器312要獲悉的無格式符號(hào)。
在步驟802,所收到的第1位被設(shè)定為“0”,這表明存儲(chǔ)于無格式符號(hào)區(qū)406的符號(hào)前有前綴位404。解碼器312從編碼字符串314中選取該無格式符號(hào)。所選取的位數(shù)取決于所選定的符號(hào)寬度。舉例而言,如果選定的符號(hào)寬度為16位,則解碼器312從編碼輸入字符串314中選取下面的16位。過程接下來繼續(xù)執(zhí)行步驟804。
在步驟804,該無格式符號(hào)被添加到解碼表320中代碼庫308的下一個(gè)序列索引上。過程接下來繼續(xù)執(zhí)行步驟806。
在步驟806,舊索引寄存器被設(shè)為代碼庫308已添加符號(hào)的索引,過程接下來繼續(xù)執(zhí)行步驟808。
在步驟808,解碼器將接收到的編碼字符串314中的符號(hào)以解碼輸出字符串304這一形式輸出出去。過程接下來繼續(xù)執(zhí)行步驟810。
在步驟810,解碼器312從編碼字符串314中選取下一位,從而確定這一編碼代碼是否包括無格式符號(hào)或索引。過程接下來繼續(xù)執(zhí)行步驟812。
在步驟812,解碼器對(duì)接收到的編碼字符串314中的下一位進(jìn)行檢查,從而確定它是否對(duì)表格索引408設(shè)定為“1”,或?qū)o格式符號(hào)406設(shè)定為“0”。如果下一位被設(shè)定為“0”,則過程繼續(xù)執(zhí)行步驟813,從而對(duì)無格式符號(hào)406進(jìn)行處理。如果下一位被設(shè)定為“1”,則過程繼續(xù)執(zhí)行步驟830,從而對(duì)表格索引408進(jìn)行處理。
在步驟813,解碼器312從編碼字符串314中選取下面的位。下面的位數(shù)取決于符號(hào)的寬度。解碼器312將這些位存儲(chǔ)于編碼字符串寄存器中。過程接下來繼續(xù)執(zhí)行步驟814。
在步驟814,解碼器312將解碼字符串的第一個(gè)符號(hào)存儲(chǔ)于某一符號(hào)寄存器中。過程接下來繼續(xù)執(zhí)行步驟814。
在步驟814,解碼器312將解碼字符串的第一個(gè)符號(hào)存儲(chǔ)于某一符號(hào)寄存器中。過程接下來繼續(xù)執(zhí)行步驟815。
在步驟815,解碼器312將舊索引位置上字符串與解碼符號(hào)加合所得到的字符串存儲(chǔ)在代碼庫308的下一個(gè)序列索引中。每當(dāng)有字符串或符號(hào)添加到代碼庫308中時(shí),解碼器312便檢查代碼庫308中的輸入數(shù)量是否達(dá)到了2的冪次。如果代碼庫308中的輸入數(shù)量達(dá)到了2的冪次,則解碼器312按結(jié)合圖7所說明的步驟增加索引的精密度。與編碼器310不同的是,解碼器312無需檢查代碼庫308是否已滿,因?yàn)闈M載狀態(tài)由編碼器310所發(fā)出的溢出碼所表示。過程接下來繼續(xù)執(zhí)行步驟816。
在步驟816,解碼器312將解碼后的符號(hào)存儲(chǔ)在代碼庫308的下一個(gè)序列索引上。過程接下來繼續(xù)執(zhí)行步驟818。
在步驟818,解碼后符號(hào)的索引或解碼后字符串的索引被儲(chǔ)存在舊索引寄存器中。過程接下來繼續(xù)執(zhí)行步驟820。
在步驟820,解碼器312將存儲(chǔ)在字符串寄存器中的解碼字符串輸出出去。過程接下來繼續(xù)執(zhí)行步驟822。
在步驟822,解碼器312確定編碼字符串314中是否有更多的位需要解碼。如果有,則過程繼續(xù)執(zhí)行步驟810。如果沒有,則過程至此全部結(jié)束。
在步驟830,新索引寄存器被設(shè)定為表格索引區(qū)408中下一個(gè)索引的內(nèi)容。存儲(chǔ)于新索引寄存器中的位數(shù)取決于編碼器所選定的索引精密度。過程接下來繼續(xù)執(zhí)行步驟832。
在步驟832,解碼器312對(duì)新索引寄存器中的內(nèi)容進(jìn)行檢查。解碼器312檢驗(yàn)所收到的索引是字符串結(jié)束碼還是溢出碼。如果所收到的索引是溢出碼,則按照結(jié)合圖7對(duì)編碼器310所做的說明對(duì)解碼表進(jìn)行初始化處理。如果收到的索引是字符串結(jié)束碼,則過程全部完成。如果收到的索引既不是字符串結(jié)束碼,也不是溢出碼,則解碼器將確定這一新索引是否有效。如果該新索引有效,則過程繼續(xù)執(zhí)行步驟834。如果該新索引無效,則過程繼續(xù)執(zhí)行步驟836。
在步驟834,解碼器312將這一新索引的解碼結(jié)果存儲(chǔ)在代碼庫的解碼字符串寄存器中。過程接下來繼續(xù)執(zhí)行步驟840。
在步驟836,新索引被確認(rèn)是無效的。解碼器312將舊索引的解碼結(jié)果存儲(chǔ)在解碼字符串寄存器中。過程接下來繼續(xù)執(zhí)行步驟838。
在步驟838,解碼器312設(shè)定解碼字符串等于解碼字符串與符號(hào)的加合。過程接下來繼續(xù)執(zhí)行步驟840。
在步驟840,解碼器312將某一符號(hào)寄存器的內(nèi)容設(shè)定為解碼字符串中的第一個(gè)符號(hào)。過程接下來繼續(xù)執(zhí)行步驟842。
在步驟842,存儲(chǔ)于代碼庫308舊索引位置上的字符串與該符號(hào)進(jìn)行加合,加合的結(jié)果存儲(chǔ)于代碼庫的下一個(gè)序列索引上。過程接下來繼續(xù)執(zhí)行步驟818。
圖9表明的是輸入字符串、輸入字符串502被處理后編碼器中代碼庫308中的內(nèi)容以及編碼字符串。圖9將結(jié)合圖5和圖6進(jìn)行說明。
在步驟600,代碼庫308通過將字符串結(jié)束碼存儲(chǔ)在索引“0”位置上以及將溢出碼存儲(chǔ)在索引“1”位置上進(jìn)行初始化。在所示實(shí)施方案中,符號(hào)的寬度被固定在2個(gè)字母(16位)。然而,符號(hào)的寬度并不限于16位,符號(hào)寬度可按已經(jīng)說明的進(jìn)行動(dòng)態(tài)修改。輸入字符串502含有多個(gè)符號(hào)9041-90410。輸入字符串502第1個(gè)16位寬的符號(hào)9041是“/w”,最后一個(gè)16位寬的符號(hào)90410是“t/”。
在步驟601,控制邏輯500對(duì)輸入字符串502進(jìn)行解析,并將第1個(gè)符號(hào)9041“/w”從輸入字符串502中提取出來。從輸入字符串502提取的符號(hào)取決于字符串指針寄存器514中的內(nèi)容。字符串指針寄存器514中的內(nèi)容最初指向輸入字符串502中的第1個(gè)符號(hào)9041,字符串寄存器512是空置的。控制邏輯500將符號(hào)9041與空置字符串寄存器512中的內(nèi)容加合起來。
在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)9041。在步驟604,在代碼庫308中沒有找到符號(hào)9041。在步驟606,編碼表300通過將符號(hào)9041存儲(chǔ)在代碼庫308的下一個(gè)序列索引即索引“2”上來獲悉符號(hào)9041,并表明符號(hào)9041是通過獲悉項(xiàng)508而獲悉的。在步驟608,存儲(chǔ)于字符串502中的符號(hào)數(shù)量為“1”,因此過程繼續(xù)執(zhí)行步驟610。在步驟610,控制邏輯500將編碼單詞9061在編碼字符串314中發(fā)送出去,這樣解碼器3 12可以獲悉符號(hào)9041。編碼單詞9061含有無格式符號(hào)9041,正如結(jié)合圖4A所說明的,9041前面帶有被設(shè)定為“0”的前綴位404。
在無格式符號(hào)9041被發(fā)送后,控制邏輯500在步驟616、617和618對(duì)各寄存器進(jìn)行修改。在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容,并將當(dāng)前字符串長(zhǎng)度518設(shè)定為“1”。在步驟617,控制邏輯將字符串寄存器512設(shè)定為空置。
在步驟622,控制邏輯500確定在輸入字符串502是否還有有效符號(hào)(不是字符串結(jié)束碼),過程繼續(xù)執(zhí)行步驟601以便繼續(xù)對(duì)輸入字符串502進(jìn)行解析。
在步驟601,輸入字符串指針寄存器514中的內(nèi)容仍然指向輸入字符串502中的第1個(gè)符號(hào)9041。控制邏輯500再次提取第1個(gè)符號(hào)9041,并將該符號(hào)與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)9041。在步驟604,在代碼庫308找到符號(hào)9041,因?yàn)榉?hào)9041在執(zhí)行步驟601-622過程中已經(jīng)存儲(chǔ)于代碼庫308中。
在步驟620,符號(hào)9041被找到,控制邏輯500推動(dòng)輸入字符串指針向前,使該指針指向輸入字符串502中的下一個(gè)符號(hào)9042。在步驟621,控制邏輯500增加存儲(chǔ)于字符串寄存器512中符號(hào)的數(shù)量。在步驟622,控制邏輯500從輸入字符串502確定是否有更多的符號(hào)要編碼。過程繼續(xù)執(zhí)行步驟601,輸入字符串指針指向輸入字符串502的第二個(gè)符號(hào)“ed”以及字符串寄存器512存儲(chǔ)第一個(gè)符號(hào)9041“/w”。
在步驟601,控制邏輯500將符號(hào)9041與輸入字符串502中下一個(gè)符號(hào)9042加合起來。在步驟602,控制邏輯500將加合得到的字符串“/wed”作為搜索索引504發(fā)送給編碼表300。在步驟604,在編碼表300未發(fā)現(xiàn)符號(hào)串“/wed”。在步驟606,通過將符號(hào)串“/wed”存儲(chǔ)在代碼庫308的下一個(gè)索引位置,即索引“3”上來獲悉符號(hào)串“/wed”。符號(hào)串“/wed”不是以無格式方式進(jìn)行存儲(chǔ)的。相反,符號(hào)串“/wed”是以參照其前綴的索引形式進(jìn)行存儲(chǔ)的。符號(hào)串“/wed”的前綴是“/w”,該前綴存儲(chǔ)在索引“2”的位置上。符號(hào)串“/wed”被存儲(chǔ)在索引“3”的位置上,正如“/w”存儲(chǔ)為表格索引“2”以及“ed”以無格式形式進(jìn)行存儲(chǔ)一樣。在步驟608,字符串寄存器512中的符號(hào)數(shù)量為2。因此,在步驟612,控制邏輯500確定最新添加字符串中最新的符號(hào)數(shù)量是否為1,在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容,并將當(dāng)前字符串長(zhǎng)度518設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串指針寄存器514中的內(nèi)容指向符號(hào)9042。字符串寄存器512是空的。在步驟601,控制邏輯將輸入字符串502中的下一個(gè)符號(hào)9042與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容,即輸入字符串502中的下一個(gè)符號(hào)9042“ed”作為搜索索引發(fā)送給編碼表300。編碼表300則在代碼庫308中搜尋符號(hào)9042。在步驟604,符號(hào)9042沒有被找到。在步驟606,編碼表300通過將符號(hào)9042存儲(chǔ)在代碼庫308的索引“4”上來獲悉符號(hào)9042。并表明編碼表正通過獲悉項(xiàng)508在獲悉符號(hào)9042。在步驟608。存儲(chǔ)的符號(hào)數(shù)量為“1”,因此過程接下來繼續(xù)執(zhí)行步驟610。在步驟610,控制邏輯500將編碼代碼9062在編碼字符串314中發(fā)送出去,這樣解碼器便可獲悉這一符號(hào)。編碼代碼9062含有無格式符號(hào)9042,如前面結(jié)合圖4A所說明的,無格式符號(hào)9042之前加有被設(shè)定為“0”的前綴位404。
在發(fā)送出無格式符號(hào)9042之后,控制邏輯500對(duì)各種寄存器進(jìn)行修改。在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容。當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)定為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
在步驟601,輸入字符串指針寄存器514中的內(nèi)容依然指向輸入字符串502中的符號(hào)9042??刂七壿?00將符號(hào)9042與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)9042。在步驟604,由于符號(hào)9042在步驟601~622的前一個(gè)循環(huán)中已存在于代碼庫308中,所以在這一步驟中在代碼庫308找到了該符號(hào)。
在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)9043。在步驟621,控制邏輯500增加存儲(chǔ)于字符串寄存器512中的符號(hào)數(shù)量。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要編碼。過程接下來繼續(xù)執(zhí)行步驟601,此時(shí)輸入字符串指針指向輸入字符串中的下一個(gè)符號(hào)9043“/w”,字符串寄存器存儲(chǔ)有符號(hào)9042“ed”。
在步驟601,控制邏輯500將存儲(chǔ)于字符串寄存器502中的符號(hào)9042與輸入字符串502中的下一個(gè)符號(hào)9043相加合。在步驟602,控制邏輯500將符號(hào)串“ed/w”作為搜索索引發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)串“ed/w”。
在步驟604,沒有找到符號(hào)串“ed/w”。在步驟606,通過將該字符串存儲(chǔ)在代碼庫308的索引5位置上來獲悉字符串“ed/w”。該字符串不是以無格式方式存儲(chǔ)的。相反,字符串“ed/w”是隨索引4參考其前綴情況下存儲(chǔ)的,因?yàn)榉?hào)“ed”存儲(chǔ)于索引4以及“/w”以無格式方式進(jìn)行存儲(chǔ)是相同的。字符串寄存器512中的字符數(shù)量為2。因此,在步驟612,控制邏輯500確定最新添加字符串中的最新符號(hào)數(shù)量為1,在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容,且當(dāng)前字符串長(zhǎng)度518被設(shè)定為1,在步驟617,控制邏輯500將字符串寄存器512設(shè)為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào),過程接下來繼續(xù)執(zhí)行步驟601。
字符串指針寄存器514中的內(nèi)容指向符號(hào)9043。字符串寄存器512為空置。在步驟601,控制邏輯500半輸入字符串502中的下一個(gè)符號(hào)9043與字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容,即輸入字符串502中的符號(hào)9043“/w”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)9043。在步驟604,由于在步驟601-622這一前次循環(huán)中“/w”已經(jīng)存儲(chǔ)在代碼庫308的索引2位置上,所以在步驟604符號(hào)9043被找到。
在步驟620,控制邏輯推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)9044。在步驟621,控制邏輯500將存儲(chǔ)于字符串寄存器512中的符號(hào)數(shù)量增至2個(gè)。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要進(jìn)行編碼。過程接下來繼續(xù)執(zhí)行步驟601,輸入字符串指針514指向輸入字符串中的下一個(gè)符號(hào)9044“e/”,字符串寄存器512存儲(chǔ)符號(hào)9043“/w”。
在步驟601,控制邏輯500將符號(hào)9043與輸入字符串502中的下一個(gè)符號(hào)9044加合起來。在步驟602,控制邏輯500將符號(hào)串“/we/”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)串“/we/”。在步驟604,符號(hào)串“/we/”未被找到。在步驟606,符號(hào)串“/we/”通過被存儲(chǔ)在代碼庫308索引6上而被獲悉。符號(hào)串不是以無格式方式進(jìn)行存儲(chǔ)的。由于符號(hào)“/w”已存儲(chǔ)在索引2上,所以符號(hào)串“/we/”在參考索引1的前綴情況下隨索引1被存儲(chǔ)起來。符號(hào)串“/we/”存儲(chǔ)在索引6上,“/w”存儲(chǔ)在索引2上,“e/”以無格式方式被存儲(chǔ)。字符串寄存器512中的符號(hào)數(shù)量為2。因此,在步驟612,控制邏輯500確定最新添加字符串中的最新符號(hào)數(shù)量為2,在步驟614,控制邏輯500將編碼代碼9063在編碼字符串314中發(fā)送出去。編碼代碼9063含有索引2,正如結(jié)合圖4B所說明的,該索引2的前面有被設(shè)定為“1”的前綴位。
在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容,且當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串指針寄存器514的內(nèi)容指向符號(hào)9044“e/”。字符串寄存器512是空置的。在步驟601,控制邏輯將輸入字符串502中下一個(gè)符號(hào)9044“e/”與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容,即輸入字符串502中的下一個(gè)符號(hào)9044“e/”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)9044。在步驟604,符號(hào)9044未被找到。在步驟606,編碼表300通過將符號(hào)9044存儲(chǔ)在代碼庫308的索引“7”上來獲悉符號(hào)9044。并表明編碼表正通過獲悉項(xiàng)508在獲悉符號(hào)9044。在步驟608,存儲(chǔ)的符號(hào)數(shù)量為“1”,因此過程接下來繼續(xù)執(zhí)行步驟610。在步驟610,控制邏輯500將編碼代碼9064在編碼字符串314中發(fā)送出去,這樣解碼器便可獲悉這一符號(hào)。編碼代碼9064含有無格式符號(hào)9044,如前面結(jié)合圖4A所說明的,無格式符號(hào)9044之前加有被設(shè)定為“0”的前綴位404。
在發(fā)送出無格式符號(hào)9044之后,控制邏輯500對(duì)各種寄存器進(jìn)行修改。在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容。當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)定為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
在步驟601,輸入字符串指針寄存器514中的內(nèi)容依然指向輸入字符串502中的符號(hào)9044。控制邏輯500將符號(hào)9044與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)9044。在步驟604,由于符號(hào)9042在步驟601~622的前一個(gè)循環(huán)中已存在于代碼庫308中,所以在這一步驟中在代碼庫308找到了該符號(hào)。
在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)9045。在步驟621,控制邏輯500將存儲(chǔ)于字符串寄存器512中的符號(hào)數(shù)量增加至2。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要編碼。過程接下來繼續(xù)執(zhí)行步驟601,此時(shí)輸入字符串指針指向輸入字符串中的下一個(gè)符號(hào)9045“we”,字符串寄存器存儲(chǔ)符號(hào)9044“e/”。
在步驟601,控制邏輯500將符號(hào)9044與輸入字符串502中下一個(gè)符號(hào)9045加合起來。在步驟602,控制邏輯500將加合得到的字符串“e/we”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)串“e/we”。在步驟604,在編碼表300未發(fā)現(xiàn)符號(hào)串“e/we”。在步驟606,通過將符號(hào)串“e/we”存儲(chǔ)在代碼庫308的下一個(gè)索引位置,即索引“8”上來獲悉符號(hào)串“e/we”。符號(hào)串“e/we”不是以無格式方式進(jìn)行存儲(chǔ)的。相反,符號(hào)串“e/we”是參照其前綴的索引形式隨索引7進(jìn)行存儲(chǔ)的,因?yàn)椤癳/”存儲(chǔ)在索引7上。符號(hào)串“e/we”被存儲(chǔ)在索引8上,“e/”存儲(chǔ)在索引7上,“we”以無格式形式進(jìn)行存儲(chǔ)。字符串寄存器512中的符號(hào)數(shù)量為2。因此,在步驟612,控制邏輯500確定最新添加字符串中最新的符號(hào)數(shù)量是否為1,在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容,并將當(dāng)前字符串長(zhǎng)度518設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串指針寄存器514的內(nèi)容指向符號(hào)9045。字符串寄存器512是空置的。在步驟601,控制邏輯將輸入字符串502中下一個(gè)符號(hào)9045“we”與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容,即輸入字符串502中的下一個(gè)符號(hào)9045“we”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)9045。在步驟604,符號(hào)9045未被找到。在步驟606,編碼表300通過將符號(hào)9045存儲(chǔ)在代碼庫308的索引9上來獲悉符號(hào)9045,并表明編碼表正通過獲悉項(xiàng)508在獲悉符號(hào)9045。在步驟608,存儲(chǔ)的符號(hào)數(shù)量為“1”,因此過程接下來繼續(xù)執(zhí)行步驟610。在步驟610,控制邏輯500將編碼代碼9065在編碼字符串314中發(fā)送出去,這樣解碼器便可獲悉這一符號(hào)。編碼代碼9065含有無格式符號(hào)9045,如前面結(jié)合圖4A所說明的,無格式符號(hào)9044之前加有被設(shè)定為“0”的前綴位404。
在發(fā)送出無格式符號(hào)9045之后,控制邏輯500對(duì)各種寄存器進(jìn)行修改。在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容。當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)定為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
在步驟601,輸入字符串指針寄存器514中的內(nèi)容依然指向輸入字符串502中的符號(hào)9045??刂七壿?00將符號(hào)9045與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)9045。在步驟604,由于符號(hào)9045在步驟601~622的前一個(gè)循環(huán)中已存在于代碼庫308中,所以在這一步驟中在代碼庫308找到了該符號(hào)。
在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)9046。在步驟621,控制邏輯500將存儲(chǔ)于字符串寄存器512中的符號(hào)數(shù)量增加至2。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要編碼。過程接下來繼續(xù)執(zhí)行步驟601,此時(shí)輸入字符串指針指向輸入字符串中的下一個(gè)符號(hào)9046“/e”,字符串寄存器存儲(chǔ)符號(hào)9045“we”。
在步驟601,控制邏輯500將符號(hào)9045與輸入字符串502中下一個(gè)符號(hào)9046加合起來。在步驟602,控制邏輯500將加合得到的字符串“wee/”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)串“wee/”。在步驟604,在編碼表300未發(fā)現(xiàn)符號(hào)串“wee/”。在步驟606,通過將符號(hào)串“wee/”存儲(chǔ)在代碼庫308的下一個(gè)索引位置,即索引10上來獲悉符號(hào)串“wee/”。符號(hào)串“wee/”不是以無格式方式進(jìn)行存儲(chǔ)的。相反,符號(hào)串“wee/”是參照其前綴的索引形式隨索引9進(jìn)行存儲(chǔ)的,因?yàn)椤皐e”存儲(chǔ)在索引9上。符號(hào)串“wee/”被作為(9,e/)存儲(chǔ)在索引10上,“e/”被存儲(chǔ)為索引9,“we”以無格式形式進(jìn)行存儲(chǔ)。字符串寄存器512中的符號(hào)數(shù)量為2。因此,在步驟612,控制邏輯500確定最新添加字符串中最新的符號(hào)數(shù)量是否為1,在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容,并將當(dāng)前字符串長(zhǎng)度518設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串指針寄存器514的內(nèi)容指向符號(hào)9046。字符串寄存器512是空置的。在步驟601,控制邏輯將輸入字符串502中下一個(gè)符號(hào)9046“e/”與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容,即輸入字符串502中的下一個(gè)符號(hào)9046“e/”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)9046。在步驟604,符號(hào)9046在索引9處被找到。
在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)9047。在步驟621,控制邏輯500將增加符號(hào)的數(shù)量。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要編碼。過程接下來繼續(xù)執(zhí)行步驟601,此時(shí)輸入字符串指針指向輸入字符串中的下一個(gè)符號(hào)9047“we”,字符串寄存器存儲(chǔ)符號(hào)9046“e/”。
在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)904。在步驟621,控制邏輯500將增加符號(hào)的數(shù)量。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要編碼。過程接下來繼續(xù)執(zhí)行步驟601,此時(shí)輸入字符串指針指向輸入字符串中的下一個(gè)符號(hào)9047“we”,字符串寄存器存儲(chǔ)符號(hào)9046“e/”。
在步驟601,控制邏輯500將符號(hào)9046與輸入字符串502中下一個(gè)符號(hào)9047加合起來。在步驟602,控制邏輯500將加合得到的字符串“e/we”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)串“e/we”。在步驟604,在索引8發(fā)現(xiàn)了符號(hào)串“e/we”。在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)9048。在步驟621,控制邏輯500將存儲(chǔ)于字符串寄存器512中的符號(hào)數(shù)量增加至3。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要編碼。過程接下來繼續(xù)執(zhí)行步驟601,此時(shí)輸入字符串指針指向輸入字符串中的下一個(gè)符號(hào)9048“b/”,字符串寄存器512存儲(chǔ)符號(hào)串“e/we”。
在步驟601,控制邏輯500將符號(hào)9048字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容“e/web/”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)串“e/web/”。在步驟604,符號(hào)串“e/web/”未被找到。在步驟606,編碼表300符號(hào)串“e/web/”存儲(chǔ)在代碼庫308的索引11上來獲悉符號(hào)串“e/web/”。符號(hào)串“e/web/”不是以無格式方式進(jìn)行存儲(chǔ)的。相反,符號(hào)串“e/web/”是參照其前綴的索引形式隨索引8進(jìn)行存儲(chǔ)的,因?yàn)椤癳/we”存儲(chǔ)在索引8上。符號(hào)串“e/web/”被作為(8,b/)存儲(chǔ)在索引11上,“e/we”存儲(chǔ)在索引8上,“b/”以無格式形式進(jìn)行存儲(chǔ)。字符串寄存器512中的符號(hào)數(shù)量為3。因此,在步驟612,控制邏輯500確定最新添加字符串中最新的符號(hào)數(shù)量不為1,在步驟614,控制邏輯500在編碼字符串314中將編碼代碼9066發(fā)送出去。編碼代碼9066含有索引8,符號(hào)串“e/we” 存儲(chǔ)在索引8上,如前面結(jié)合圖4B所說明的,索引8之前加有被設(shè)定為“1”的前綴位。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串指針寄存器514的內(nèi)容指向符號(hào)9048。字符串寄存器512是空置的。在步驟601,控制邏輯將輸入字符串502中下一個(gè)符號(hào)9048“b/”與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容,即輸入字符串502中的下一個(gè)符號(hào)9048“b/”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)9048。在步驟604,符號(hào)9048未被找到。在步驟606,編碼表300通過將符號(hào)9048存儲(chǔ)在代碼庫308的索引12上來獲悉符號(hào)9048,并表明編碼表正通過獲悉項(xiàng)508在獲悉符號(hào)9048。在步驟608,存儲(chǔ)的符號(hào)數(shù)量為“1”,因此過程接下來繼續(xù)執(zhí)行步驟610。在步驟610,控制邏輯500將編碼代碼9067在編碼字符串314中發(fā)送出去,這樣解碼器便可獲悉這一符號(hào)。編碼代碼9067含有無格式符號(hào)9048,如前面結(jié)合圖4A所說明的,無格式符號(hào)9048之前加有被設(shè)定為“0”的前綴位404。
在發(fā)送出無格式符號(hào)9048之后,控制邏輯500對(duì)各種寄存器進(jìn)行修改。在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容。當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)定為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串寄存器512為空置。在步驟601,輸入字符串指針寄存器514中的內(nèi)容依然指向輸入字符串502中的符號(hào)9048??刂七壿?00將符號(hào)9048與字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)9048。在步驟604,由于符號(hào)9048在步驟601~622的前一個(gè)循環(huán)中已存在于代碼庫308中,所以在這一步驟中在代碼庫308找到了該符號(hào)。
在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)9049。在步驟621,控制邏輯500增加符號(hào)的數(shù)量。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要編碼。過程接下來繼續(xù)執(zhí)行步驟601,此時(shí)輸入字符串指針指向輸入字符串中的下一個(gè)符號(hào)9049“we”,字符串寄存器存儲(chǔ)符號(hào)9048“b/”。
在步驟601,控制邏輯500將符號(hào)9048與輸入字符串502中下一個(gè)符號(hào)9049加合起來。在步驟602,控制邏輯500將加合得到的字符串“b/we”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)串“b/we”。在步驟604,在編碼表300未發(fā)現(xiàn)符號(hào)串“b/we”。在步驟606,通過將符號(hào)串“b/we”存儲(chǔ)在代碼庫308的下一個(gè)索引位置,即索引13上來獲悉符號(hào)串“b/we”。該符號(hào)串不是以無格式方式進(jìn)行存儲(chǔ)的。相反,符號(hào)串“b/we”是參照其前綴的索引形式隨索引12進(jìn)行存儲(chǔ)的,因?yàn)椤癰/”存儲(chǔ)在索引12上。符號(hào)串“b/we”被作為(12,we)存儲(chǔ)在索引13上,“b/”被存儲(chǔ)為索引12,“we”以無格式形式進(jìn)行存儲(chǔ)。字符串寄存器512中的符號(hào)數(shù)量為2。因此,在步驟612,控制邏輯500確定最新添加字符串中最新的符號(hào)數(shù)量是否為1,在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容,并將當(dāng)前字符串長(zhǎng)度518設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串指針寄存器514的內(nèi)容指向符號(hào)9049。字符串寄存器512是空置的。在步驟601,控制邏輯將輸入字符串502中下一個(gè)符號(hào)9049“we”與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容,即輸入字符串502中的下一個(gè)符號(hào)9049“we”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)9049。在步驟604,符號(hào)9049被找到。
在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)9049。在步驟621,控制邏輯500增加符號(hào)的數(shù)量。在步驟622,控制邏輯500確定輸入字符串502是否還有符號(hào)需要編碼。過程接下來繼續(xù)執(zhí)行步驟601,此時(shí)輸入字符串指針指向輸入字符串中的下一個(gè)符號(hào)90410“t/”,字符串寄存器存儲(chǔ)符號(hào)9049“we”。
在步驟601,控制邏輯500將符號(hào)9049與輸入字符串502中下一個(gè)符號(hào)90410加合起來。在步驟602,控制邏輯500將加合得到的字符串“wet/”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)串“wet/”。在步驟604,在編碼表300未發(fā)現(xiàn)符號(hào)串“wet/”。在步驟606,通過將符號(hào)串“wet/”存儲(chǔ)在代碼庫308的下一個(gè)索引位置,即索引14上來獲悉符號(hào)串“wet/”。該符號(hào)串不是以無格式方式進(jìn)行存儲(chǔ)的。相反,符號(hào)串“wet/”是參照其前綴的索引形式隨索引9進(jìn)行存儲(chǔ)的,因?yàn)椤皐e”存儲(chǔ)在索引9上。符號(hào)串“wet/”被作為(9,t/)存儲(chǔ)在索引14上,“we”被存儲(chǔ)為索引9,“t/”以無格式形式進(jìn)行存儲(chǔ)。字符串寄存器512中的符號(hào)數(shù)量為2。因此,在步驟612,控制邏輯500確定最新添加字符串中最新的符號(hào)數(shù)量不為1,在步驟614,控制邏輯500在編碼字符串314中將編碼代碼9068發(fā)送出去。編碼代碼9068含有索引9,如前面結(jié)合圖4B所說明的,索引9之前加有被設(shè)定為“1”的前綴位。在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容,并將當(dāng)前字符串長(zhǎng)度518設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串指針寄存器514的內(nèi)容指向符號(hào)90410。字符串寄存器512是空置的。在步驟601,控制邏輯將輸入字符串502中下一個(gè)符號(hào)90410“t/”與空置字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容,即輸入字符串502中的下一個(gè)符號(hào)90410“t/”作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308搜尋符號(hào)90410。在步驟604,在編碼表300未發(fā)現(xiàn)符號(hào)90410。在步驟606,通過將90410存儲(chǔ)在代碼庫308的下一個(gè)索引位置,即索引15上來獲悉90410,并表明編碼表正通過獲悉項(xiàng)508在獲悉符號(hào)9048。在步驟608,存儲(chǔ)的符號(hào)數(shù)量為“1”,因此過程繼續(xù)執(zhí)行步驟610。在步驟610,控制邏輯500將編碼單詞9069在編碼字符串314中發(fā)送出去,這樣解碼器312可以獲悉符號(hào)9069。編碼單詞9069含有無格式符號(hào)9049,正如結(jié)合圖4A所說明的,9049前面帶有被設(shè)定為“0”的前綴位404。
在發(fā)送出無格式符號(hào)90410之后,控制邏輯500對(duì)各種寄存器進(jìn)行修改。在步驟616,控制邏輯500將最新添加長(zhǎng)度522設(shè)定為當(dāng)前字符串長(zhǎng)度518中的內(nèi)容。當(dāng)前字符串長(zhǎng)度518被設(shè)定為“1”。在步驟617,控制邏輯500將字符串寄存器512設(shè)定為空置。
在步驟622,控制邏輯500確定輸入字符串502中是否還有有效符號(hào)(不是字符串結(jié)束碼),過程接下來繼續(xù)執(zhí)行步驟601。
字符串寄存器512為空置。在步驟601,輸入字符串指針寄存器514中的內(nèi)容依然指向輸入字符串502中的符號(hào)90410??刂七壿?00將符號(hào)90410與字符串寄存器512中的內(nèi)容加合起來。在步驟602,控制邏輯500將字符串寄存器512中的內(nèi)容作為搜索索引504發(fā)送給編碼表300。編碼表300在代碼庫308中搜尋符號(hào)90410。在步驟604,由于符號(hào)90410在步驟601~622的前一個(gè)循環(huán)中已存在于代碼庫308中,所以在這一步驟中在代碼庫308找到了該符號(hào)。
在步驟620,控制邏輯向前推進(jìn)輸入字符串指針514,使其指向輸入字符串502中的下一個(gè)符號(hào)。在步驟621,控制邏輯500增加符號(hào)的數(shù)量。
在步驟622,控制邏輯500檢測(cè)到了字符串結(jié)束碼,過程接下來繼續(xù)執(zhí)行步驟624。
在步驟624,控制邏輯500將字符串結(jié)束碼的索引在編碼單詞90610中發(fā)送出去。
如果假定9041~90410每個(gè)符號(hào)都是16位寬,則不包括字符串結(jié)束碼在內(nèi)且具有10個(gè)字符的輸入字符串需要160位(10×16)。編碼代碼串9061-10將發(fā)送出去的位數(shù)減少到了120位。120位這一數(shù)字由如下計(jì)算得到9061、9062、9064、9061、9065、9067和9069這7個(gè)編碼代碼的無格式符號(hào)為(6×17)位,編碼代碼9063中的索引2為3位,編碼代碼9066、9068、90610中的索引8、9、10為5位。與LZW算法相比,這種方法需要更少的內(nèi)存來存儲(chǔ)代碼,并且在發(fā)送編碼數(shù)據(jù)流314時(shí)需要更少的位數(shù)。由于符號(hào)可被獲悉,以及接收到重復(fù)或已獲悉的字符串,所以這種方法達(dá)到了更大的壓縮效果。
對(duì)編碼數(shù)據(jù)314的處理由解碼器使用圖8A-8B所表明的方法執(zhí)行。
雖然本發(fā)明是結(jié)合優(yōu)選實(shí)施方案進(jìn)行具體說明的,但本領(lǐng)域中的技術(shù)人員應(yīng)該理解的是,在不脫離本文所附權(quán)利要求所涵蓋范圍的情況下,對(duì)本發(fā)明的形式和細(xì)節(jié)可以進(jìn)行各種各樣的修改。
權(quán)利要求
1.一種對(duì)字符串進(jìn)行壓縮的方法,該壓縮方法包括以下步驟在代碼庫中搜尋接收字符串中的符號(hào);一旦發(fā)現(xiàn)該符號(hào)未存儲(chǔ)在代碼庫中,通過將該符號(hào)存儲(chǔ)在代碼庫中來獲悉該符號(hào);將該符號(hào)以編碼單詞的形式發(fā)送出去。
2.根據(jù)權(quán)利要求1的方法,還包括以下步驟一旦發(fā)現(xiàn)該符號(hào)存儲(chǔ)在代碼庫中,則以編碼代碼的方式將代碼庫該符號(hào)存儲(chǔ)位置的索引發(fā)送出去。
3.根據(jù)權(quán)利要求1的方法,還包括以下步驟一旦發(fā)現(xiàn)符號(hào)串未存儲(chǔ)于代碼庫中,則發(fā)送出一個(gè)索引,該符號(hào)串的最長(zhǎng)前綴存儲(chǔ)于代碼庫的該索引處。
4.根據(jù)權(quán)利要求1的方法,其中符號(hào)的寬度是可變的。
5.根據(jù)權(quán)利要求1的方法,其中編碼代碼含有前綴區(qū)。
6.根據(jù)權(quán)利要求5的方法,其中前綴區(qū)的狀態(tài)標(biāo)志著編碼代碼中的內(nèi)容。
7.根據(jù)權(quán)利要求6的方法,其中前綴區(qū)的狀態(tài)表明了該編碼代碼是要被獲悉的無格式符號(hào)還是一項(xiàng)索引。
8.根據(jù)如權(quán)利要求2的方法,其中索引的寬度是可變的。
9.根據(jù)權(quán)利要求8的方法,其中索引的寬度取決于存儲(chǔ)于代碼庫串已知項(xiàng)目的數(shù)量。
10.根據(jù)權(quán)利要求1的方法,其中搜尋步驟對(duì)某一符號(hào)串進(jìn)行搜尋;獲悉步驟通過將某一符號(hào)串存儲(chǔ)在代碼庫中來蕕悉某一符號(hào)串;發(fā)送步驟將某一索引以編碼代碼的形式發(fā)送出去,與該符號(hào)串相匹配的最長(zhǎng)前綴存儲(chǔ)于這一索引位置上。
11.一種對(duì)字符串進(jìn)行壓縮的裝置,該裝置包括用于存儲(chǔ)接收到的字符串符號(hào)的代碼庫;在代碼庫中搜尋符號(hào)的控制邏輯,一旦發(fā)現(xiàn)符號(hào)未存儲(chǔ)于代碼庫中,則控制邏輯以編碼代碼的形式將這一符號(hào)發(fā)送出去,并通過將這一符號(hào)存儲(chǔ)在代碼庫中來獲悉這一符號(hào)。
12.根據(jù)權(quán)利要求11的裝置,其中一旦發(fā)現(xiàn)代碼庫中存儲(chǔ)有這一符號(hào),則控制邏輯將該符號(hào)代碼庫中存儲(chǔ)位置索索引以編碼代碼的形式發(fā)出去。
13.根據(jù)權(quán)利要求11的裝置,其中一旦發(fā)現(xiàn)字符串未存儲(chǔ)代碼庫中,控制邏輯在編碼代碼中將某一索引發(fā)送出去,在該索引位置中存儲(chǔ)著該字符串的最長(zhǎng)前綴。
14.根據(jù)權(quán)利要求12的裝置,其中符號(hào)的寬度是可以變化的。
15.根據(jù)權(quán)利要求12的裝置,其中編碼代碼含有前綴區(qū)。
16.根據(jù)權(quán)利要求15的裝置,其中前綴區(qū)的狀態(tài)標(biāo)志著編碼代碼的內(nèi)容。
17.根據(jù)權(quán)利要求16的裝置,其中前綴區(qū)的狀態(tài)表明了編碼代碼是將要被獲悉的無格式符號(hào)還是某個(gè)索引。
18.根據(jù)權(quán)利要求11的裝置,其中索引的寬度是可以變化的。
19.根據(jù)權(quán)利要求18的裝置,其中索引的寬度取決于存儲(chǔ)于代碼庫中已知項(xiàng)目的數(shù)量。
20.根據(jù)權(quán)利要求11的裝置,其中控制邏輯在代碼庫搜尋某一字符串,并在編碼代碼中將與這一字符串最長(zhǎng)相配前綴所存儲(chǔ)位置的索引發(fā)送出去,控制邏輯通過將該字符串存儲(chǔ)在代碼庫中來獲悉這一字符串。
21.一種對(duì)字符串進(jìn)行壓縮的裝置,該裝置包括用于存儲(chǔ)接收到的字符串符號(hào)的代碼庫;在代碼庫中搜尋符號(hào)的工具;一旦發(fā)現(xiàn)符號(hào)未存儲(chǔ)于代碼庫中,則以編碼代碼的形式將這一符號(hào)發(fā)送出去的工具;通過將這一符號(hào)存儲(chǔ)在代碼庫中來獲悉這一符號(hào)的工具。
22.根據(jù)權(quán)利要求21的裝置,其中一旦發(fā)現(xiàn)符號(hào)存儲(chǔ)于代碼庫中,發(fā)送工具便將該符存儲(chǔ)于代碼庫中位置的索引發(fā)送出去。
23.根據(jù)權(quán)利要求21的裝置,其中符號(hào)的寬度是可以變化的。
24.根據(jù)權(quán)利要求22的裝置,其中編碼代碼含有前綴區(qū)。
25.根據(jù)權(quán)利要求23的裝置,其中前綴區(qū)的狀態(tài)標(biāo)志著編碼代碼的內(nèi)容。
26.根據(jù)權(quán)利要求25的裝置,其中前綴區(qū)的狀態(tài)表明了編碼代碼是將要被獲悉的無格式符號(hào)還是某個(gè)索引。
27.根據(jù)權(quán)利要求21的裝置,其中索引的寬度是可以變化的。
28.根據(jù)權(quán)利要求27的裝置,其中索引的寬度取決于存儲(chǔ)于代碼庫中已知項(xiàng)目的數(shù)量。
29.一種對(duì)字符串進(jìn)行壓縮的方法,該方法包括以下步驟在代碼庫中搜尋與符號(hào)序列相匹配的最長(zhǎng)前綴,其中符號(hào)序列的寬度是可變的;一旦發(fā)現(xiàn)字符串的符號(hào)未存儲(chǔ)于代碼庫中,則以編碼代碼的形式這一符號(hào)發(fā)送出去,編碼代碼含有前綴區(qū),前綴區(qū)的狀態(tài)標(biāo)志著這一編碼代碼是將要被獲悉的無格式符號(hào)還是一項(xiàng)索引,該符號(hào)通過被存儲(chǔ)在代碼庫中而被獲悉;一旦發(fā)現(xiàn)該符號(hào)序列存儲(chǔ)于代碼庫中,則將該符號(hào)序列存儲(chǔ)在代碼庫中位置的索引發(fā)送出去,索引的寬度取決于代碼庫中已知項(xiàng)目的數(shù)量。
30.一種對(duì)編碼代碼序列進(jìn)行解壓縮的方法,該方法包括以下步驟接收編碼代碼;一旦發(fā)現(xiàn)存儲(chǔ)于編碼代碼中的符號(hào),便通過將該符號(hào)存儲(chǔ)于代碼庫中來獲悉該符號(hào);將該符號(hào)解碼為數(shù)據(jù)。
31.根據(jù)權(quán)利要求30的方法,其中獲悉步驟還包括通過將以前獲悉的符號(hào)同該符號(hào)進(jìn)行加合,并將符號(hào)序列存儲(chǔ)于代碼庫中來獲悉某一符號(hào)序列。
32.根據(jù)權(quán)利要求30的方法,還包括一旦發(fā)現(xiàn)存儲(chǔ)于編碼代碼中的代碼庫索引,便將該索引解碼。
33.根據(jù)權(quán)利要求32的方法,其中索引的解碼結(jié)果是某一符號(hào)。
34.根據(jù)權(quán)利要求32的方法,其中索引的解碼結(jié)果是某一符號(hào)序列。
35.根據(jù)權(quán)利要求30的方法,其中符號(hào)的寬度是可變的。
36.根據(jù)權(quán)利要求30的方法,其中編碼代碼含有前綴區(qū)。
37.根據(jù)權(quán)利要求36的方法,其中前綴區(qū)的狀態(tài)標(biāo)志著編碼代碼的內(nèi)容。
38.根據(jù)權(quán)利要求37的方法,其中前綴區(qū)的狀態(tài)表明了編碼代碼是將要被獲悉的無格式符號(hào)還是某個(gè)索引。
39.根據(jù)權(quán)利要求32的方法,其中索引的寬度是可以變化的。
40.一種對(duì)編碼代碼序列進(jìn)行解壓縮的裝置,該裝置包括用于存儲(chǔ)接收到的無格式符號(hào)的代碼庫;接收到編碼代碼、檢測(cè)存儲(chǔ)于編碼代碼中的無格式符號(hào)、將該符號(hào)存儲(chǔ)于代碼庫中并將該符號(hào)解碼成數(shù)據(jù)的邏輯。
41.根據(jù)權(quán)利要求40的裝置,其中的邏輯通過將以前獲悉的符號(hào)與存儲(chǔ)于編碼代碼中的無格式符號(hào)加合起來并將符號(hào)序列存儲(chǔ)在代碼庫中來獲悉符號(hào)序列。
42.根據(jù)權(quán)利要求40的裝置,還包括一旦發(fā)現(xiàn)存儲(chǔ)于編碼代碼中的代碼庫索引,便將該索引解碼。
43.根據(jù)權(quán)利要求42的裝置,其中索引的解碼結(jié)果是某一符號(hào)。
44.根據(jù)權(quán)利要求42的裝置,其中索引的解碼結(jié)果是某一符號(hào)序列。
45.根據(jù)權(quán)利要求40的裝置,其中符號(hào)的寬度是可變的。
46.根據(jù)權(quán)利要求40的裝置,其中編碼代碼含有前綴區(qū)。
47.根據(jù)權(quán)利要求46的裝置,其中前綴區(qū)的狀態(tài)標(biāo)志著編碼代碼的內(nèi)容。
48.根據(jù)權(quán)利要求47的裝置,其中前綴區(qū)的狀態(tài)表明了編碼代碼是將要被獲悉的無格式符號(hào)還是某個(gè)索引。
49.根據(jù)權(quán)利要求40的裝置,其中索引的寬度是可以變化的。
全文摘要
本文提供適合數(shù)據(jù)壓縮的方法和設(shè)置。當(dāng)符號(hào)被編碼和解碼時(shí),編碼器和解碼器中便適當(dāng)?shù)亟⒁粋€(gè)字母和詞匯,并在代碼庫中將其存儲(chǔ)起來。每當(dāng)編碼器對(duì)一未知符號(hào)進(jìn)行編碼時(shí),編碼器便將這一符號(hào)添加到詞庫中,并已無格式方式將其在編碼字符串中發(fā)送出去。編碼器所傳送的編碼字符包括符號(hào)和索引。位于編碼字符前面的前綴位的狀態(tài)表明了該編碼代碼是否是存儲(chǔ)于代碼庫中的無格式符號(hào),還是符號(hào)的索引或是一串符號(hào)。解碼器在收到每個(gè)編碼代碼時(shí)對(duì)其前綴位進(jìn)行檢驗(yàn),從而確定該編碼代碼是否存有無格式符號(hào)或索引。如果這一編碼代碼含有無格式符號(hào),則解碼器通過將以前解碼符號(hào)串與當(dāng)前所解符號(hào)中的第一個(gè)符號(hào)加合起來并將該符號(hào)加入到代碼庫中來獲悉這一符號(hào)。如果該編碼代碼含有索引,則解碼器通過提取存儲(chǔ)在不同索引位置的符號(hào)或符號(hào)序列來對(duì)該編碼代碼進(jìn)行解碼。
文檔編號(hào)H03M7/30GK1593011SQ02806626
公開日2005年3月9日 申請(qǐng)日期2002年2月11日 優(yōu)先權(quán)日2001年2月13日
發(fā)明者阿布達(dá)特·莫拉德 申請(qǐng)人:莫塞德技術(shù)股份有限公司