GIF圖形文件格式介紹和說明_第1頁
GIF圖形文件格式介紹和說明_第2頁
GIF圖形文件格式介紹和說明_第3頁
GIF圖形文件格式介紹和說明_第4頁
GIF圖形文件格式介紹和說明_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、GIF圖形文件格式文檔 1.概述GIF圖象是基于顏色列表的(存儲(chǔ)的數(shù)據(jù)是該點(diǎn)的顏色對(duì)應(yīng)于顏色列表的索引值),最多只支持8位(256色)。GIF文件內(nèi)部分成許多存儲(chǔ)塊,用來存儲(chǔ)多幅圖象或者是決定圖象表現(xiàn)行為的控制塊,用以實(shí)現(xiàn)動(dòng)畫和交互式應(yīng)用。2.GIF文件存儲(chǔ)結(jié)構(gòu)GIF文件內(nèi)部是按塊劃分的,包括控制塊( Control Block )和數(shù)據(jù)塊(Data Sub-blocks)兩種??刂茐K是控制數(shù)據(jù)塊行為的,根據(jù)不同的控制塊包含一些不同的控制參數(shù);數(shù)據(jù)塊只包含一些8-bit的字符流,由它前面的控制塊來決定它的功能,每個(gè)數(shù)據(jù)塊0到255個(gè)字節(jié),數(shù)據(jù)塊的第一個(gè)字節(jié)指出這個(gè)數(shù)據(jù)塊大?。ㄗ止?jié)數(shù)),所以一個(gè)

2、空的數(shù)據(jù)塊有一個(gè)字節(jié),那就是數(shù)據(jù)塊的大小0x00。下表是一個(gè)數(shù)據(jù)塊的結(jié)構(gòu):BYTE76543210BIT0塊大小Block Size - 塊大小,不包括這個(gè)這個(gè)字節(jié)(不計(jì)算塊大小自身)1Data Values - 塊數(shù)據(jù),8-bit的字符串2.254255一個(gè)GIF文件的結(jié)構(gòu)可分為文件頭(File Header)、GIF數(shù)據(jù)流(GIF Data Stream)和文件終結(jié)器(Trailer)三個(gè)部分。文件頭包含GIF文件署名(Signature)和版本號(hào)(Version);GIF數(shù)據(jù)流由控制標(biāo)識(shí)符、圖象塊(Image Block)和其他的一些擴(kuò)展塊組成;文件終結(jié)器只有一個(gè)值為0x3B的字符(;)

3、表示文件結(jié)束。下表顯示了一個(gè)GIF文件的組成結(jié)構(gòu):GIF署名文件頭版本號(hào)邏輯屏幕標(biāo)識(shí)符GIF數(shù)據(jù)流全局顏色列表.圖象標(biāo)識(shí)符圖象塊 圖象局部顏色列表圖 基于顏色列表的圖象數(shù)據(jù).GIF結(jié)尾文件結(jié)尾下面就具體介紹各個(gè)部分:文件頭部分(Header)GIF署名(Signature)和版本號(hào)(Version)GIF署名用來確認(rèn)一個(gè)文件是否是GIF格式的文件,這一部分由三個(gè)字符組成:GIF;文件版本號(hào)也是由三個(gè)字節(jié)組成,可以為87a或89a.具體描述見下表:BYTE76543210BIT1GGIF文件標(biāo)識(shí)2I3F48GIF文件版本號(hào):87a - 1987年5月 89a - 1989年7月57或96aGIF

4、數(shù)據(jù)流部分(GIF Data Stream)邏輯屏幕標(biāo)識(shí)符(Logical Screen Descriptor)這一部分由7個(gè)字節(jié)組成,定義了GIF圖象的大小(Logical Screen Width & Height)、顏色深度(Color Bits)、背景色(Blackground Color Index)以及有無全局顏色列表(Global Color Table)和顏色列表的索引數(shù)(Index Count),具體描述見下表:BYTE76543210BIT1邏輯屏幕寬度像素?cái)?shù),定義GIF圖象的寬度23邏輯屏幕高度像素?cái)?shù),定義GIF圖象的高度45mcrspixel6背景色背景顏色(在全局顏色

5、列表中的索引,如果沒有全局顏色列表,該值沒有意義)7像素寬高比像素寬高比(Pixel Aspect Radio)m - 全局顏色列表標(biāo)志(Global Color Table Flag),當(dāng)置位時(shí)表示有全局顏色列表,pixel值有意義.cr - 顏色深度(Color ResoluTion),cr+1確定圖象的顏色深度.s - 分類標(biāo)志(Sort Flag),如果置位表示全局顏色列表分類排列.pixel - 全局顏色列表大小,pixel+1確定顏色列表索引數(shù)(2的pixel+1次方).全局顏色列表(Global Color Table)全局顏色列表必須緊跟在邏輯屏幕標(biāo)識(shí)符后面,每個(gè)顏色列表索引條

6、目由三個(gè)字節(jié)組成,按R、G、B的順序排列。BYTE76543210BIT1索引1的紅色值2索引1的綠色值3索引1的藍(lán)色值4索引2的紅色值5索引2的綠色值6索引2的藍(lán)色值7. 圖象標(biāo)識(shí)符(Image Descriptor)一個(gè)GIF文件內(nèi)可以包含多幅圖象,一幅圖象結(jié)束之后緊接著下是一幅圖象的標(biāo)識(shí)符,圖象標(biāo)識(shí)符以0x2C(,)字符開始,定義緊接著它的圖象性質(zhì),包括圖象相對(duì)于邏輯屏幕邊界的偏移量、圖象大小以及有無局部顏色列表和顏色列表大小,由10個(gè)字節(jié)組成:BYTE76543210BIT100101100圖象標(biāo)識(shí)符開始,固定值為,2X方向偏移量必須限定在邏輯屏幕尺寸范圍內(nèi)34Y方向偏移量56圖象寬度

7、78圖象高度910misrpixelm - 局部顏色列表標(biāo)志(Local Color Table Flag)置位時(shí)標(biāo)識(shí)緊接在圖象標(biāo)識(shí)符之后有一個(gè)局部顏色列表,供緊跟在它之后的一幅圖象使用;值否時(shí)使用全局顏色列表,忽略pixel值。i - 交織標(biāo)志(Interlace Flag),置位時(shí)圖象數(shù)據(jù)使用連續(xù)方式排列,否則使用順序排列。s - 分類標(biāo)志(Sort Flag),如果置位表示緊跟著的局部顏色列表分類排列.r - 保留,必須初始化為0.pixel - 局部顏色列表大小(Size of Local Color Table),pixel+1就為顏色列表的位數(shù)局部顏色列表(Local Color

8、Table)如果上面的局部顏色列表標(biāo)志置位的話,則需要在這里(緊跟在圖象標(biāo)識(shí)符之后)定義一個(gè)局部顏色列表以供緊接著它的圖象使用,注意使用前應(yīng)線保存原來的顏色列表,使用結(jié)束之后回復(fù)原來保存的全局顏色列表。如果一個(gè)GIF文件即沒有提供全局顏色列表,也沒有提供局部顏色列表,可以自己創(chuàng)建一個(gè)顏色列表,或使用系統(tǒng)的顏色列表。RGBRGB.基于顏色列表的圖象數(shù)據(jù)(Table-Based Image Data)由兩部分組成:LZW編碼長(zhǎng)度(LZW Minimum Code Size)和圖象數(shù)據(jù)(Image Data)。BYTE76543210BIT1LZW編碼長(zhǎng)度LZW編碼初始碼表大小的位數(shù),詳細(xì)描述見LZ

9、W編碼. .圖象數(shù)據(jù),由一個(gè)或幾個(gè)數(shù)據(jù)塊組成數(shù)據(jù)塊.GIF圖象數(shù)據(jù)使用了LZW壓縮算法,大大減小了圖象數(shù)據(jù)的大小。圖象數(shù)據(jù)在壓縮前有兩種排列格式:連續(xù)的和交織的(由圖象標(biāo)識(shí)符的交織標(biāo)志控制)。連續(xù)方式按從左到右、從上到下的順序排列圖象的光柵數(shù)據(jù);交織圖象按下面的方法處理光柵數(shù)據(jù):創(chuàng)建四個(gè)通道(pass)保存數(shù)據(jù),每個(gè)通道提取不同行的數(shù)據(jù):第一通道(Pass 1)提取從第0行開始每隔8行的數(shù)據(jù);第二通道(Pass 2)提取從第4行開始每隔8行的數(shù)據(jù);第三通道(Pass 3)提取從第2行開始每隔4行的數(shù)據(jù);第四通道(Pass 4)提取從第1行開始每隔2行的數(shù)據(jù);下面的例子演示了提取交織圖象數(shù)據(jù)的順

10、序:行通道1通道2通道3通道40 -11-42 -33 -44 -25 -46 -37 -48 -19 -410-311 -412 -213 -414 -315 -416 -117 -418 -319 -420 -2圖形控制擴(kuò)展(Graphic Control Extension)這一部分是可選的(需要89a版本),可以放在一個(gè)圖象塊(包括圖象標(biāo)識(shí)符、局部顏色列表和圖象數(shù)據(jù))或文本擴(kuò)展塊的前面,用來控制跟在它后面的第一個(gè)圖象(或文本)渲染(Render)形式,組成結(jié)構(gòu)如下:BYTE76543210BIT擴(kuò)展塊標(biāo)識(shí)Extension Introducer - 標(biāo)識(shí)這是一個(gè)擴(kuò)展塊,固定值0x21圖

11、形控制擴(kuò)展標(biāo)簽Graphic Control Label - 標(biāo)識(shí)這是一個(gè)圖形控制擴(kuò)展塊,固定值0xF9塊大小Block Size - 不包括塊終結(jié)器,固定值4保留處置方法i t i - 用戶輸入標(biāo)志;t - 透明色標(biāo)志。延遲時(shí)間Delay Time - 單位1/100秒,如果值不為1,表示暫停規(guī)定的時(shí)間后再繼續(xù)往下處理數(shù)據(jù)流透明色索引Transparent Color Index - 透明色索引值塊終結(jié)器Block Terminator - 標(biāo)識(shí)塊終結(jié),固定值0處置方法(Disposal Method):指出處置圖形的方法,當(dāng)值為: 0 - 不使用處置方法 1 - 不處置圖形,把圖形從當(dāng)前位

12、置移去 2 - 回復(fù)到背景色 3 - 回復(fù)到先前狀態(tài) 4-7 - 自定義用戶輸入標(biāo)志(Use Input Flag):指出是否期待用戶有輸入之后才繼續(xù)進(jìn)行下去,置位表示期待,值否表示不期待。用戶輸入可以是按回車鍵、鼠標(biāo)點(diǎn)擊等,可以和延遲時(shí)間一起使用,在設(shè)置的延遲時(shí)間內(nèi)用戶有輸入則馬上繼續(xù)進(jìn)行,或者沒有輸入直到延遲時(shí)間到達(dá)而繼續(xù)透明顏色標(biāo)志(Transparent Color Flag):置位表示使用透明顏色注釋擴(kuò)展(Comment Extension)這一部分是可選的(需要89a版本),可以用來記錄圖形、版權(quán)、描述等任何的非圖形和控制的純文本數(shù)據(jù)(7-bit ASCII字符),注釋擴(kuò)展并不影響

13、對(duì)圖象數(shù)據(jù)流的處理,解碼器完全可以忽略它。存放位置可以是數(shù)據(jù)流的任何地方,最好不要妨礙控制和數(shù)據(jù)塊,推薦放在數(shù)據(jù)流的開始或結(jié)尾。具體組成:BYTE76543210BIT1擴(kuò)展塊標(biāo)識(shí)Extension Introducer - 標(biāo)識(shí)這是一個(gè)擴(kuò)展塊,固定值0x212注釋塊標(biāo)簽Comment Label - 標(biāo)識(shí)這是一個(gè)注釋塊,固定值0xFE.Comment Data - 一個(gè)或多個(gè)數(shù)據(jù)塊組成注釋塊.塊終結(jié)器Block Terminator - 標(biāo)識(shí)注釋塊結(jié)束,固定值0圖形文本擴(kuò)展(Plain Text Extension)這一部分是可選的(需要89a版本),用來繪制一個(gè)簡(jiǎn)單的文本圖象,這一部分由用

14、來繪制的純文本數(shù)據(jù)(7-bit ASCII字符)和控制繪制的參數(shù)等組成。繪制文本借助于一個(gè)文本框(Text Grid)來定義邊界,在文本框中劃分多個(gè)單元格,每個(gè)字符占用一個(gè)單元,繪制時(shí)按從左到右、從上到下的順序依次進(jìn)行,直到最后一個(gè)字符或者占滿整個(gè)文本框(之后的字符將被忽略,因此定義文本框的大小時(shí)應(yīng)該注意到是否可以容納整個(gè)文本),繪制文本的顏色使用全局顏色列表,沒有則可以使用一個(gè)已經(jīng)保存的前一個(gè)顏色列表。另外,圖形文本擴(kuò)展塊也屬于圖形塊(Graphic Rendering Block),可以在它前面定義圖形控制擴(kuò)展對(duì)它的表現(xiàn)形式進(jìn)一步修改。圖形文本擴(kuò)展的組成:BYTE76543210BIT1擴(kuò)

15、展塊標(biāo)識(shí)Extension Introducer - 標(biāo)識(shí)這是一個(gè)擴(kuò)展塊,固定值0x212圖形控制擴(kuò)展標(biāo)簽Plain Text Label - 標(biāo)識(shí)這是一個(gè)圖形文本擴(kuò)展塊,固定值0x013塊大小Block Size - 塊大小,固定值124文本框左邊界位置Text Glid Left Posotion - 像素值,文本框離邏輯屏幕的左邊界距離56文本框上邊界位置Text Glid Top Posotion - 像素值,文本框離邏輯屏幕的上邊界距離78文本框高度Text Glid Width -像素值910文本框高度Text Glid Height - 像素值1112字符單元格寬度Charact

16、er Cell Width - 像素值,單個(gè)單元格寬度13字符單元格高度Character Cell Height- 像素值,單個(gè)單元格高度14文本前景色索引Text Foreground Color Index - 前景色在全局顏色列表中的索引15文本背景色索引Text Blackground Color Index - 背景色在全局顏色列表中的索引N.Plain Text Data - 一個(gè)或多個(gè)數(shù)據(jù)塊組成,保存要在顯示的字符串。文本數(shù)據(jù)塊.N+1塊終結(jié)Block Terminator - 標(biāo)識(shí)注釋塊結(jié)束,固定值0推薦:1.由于文本的字體(Font)和尺寸(Size)沒有定義,解碼器應(yīng)該根

17、據(jù)情況選擇最合適的;2.如果一個(gè)字符的值小于0x20或大于0xF7,則這個(gè)字符被推薦顯示為一個(gè)空格(0x20);3.為了兼容性,最好定義字符單元格的大小為8x8或8x16(寬度x高度)。應(yīng)用程序擴(kuò)展(Application Extension)這是提供給應(yīng)用程序自己使用的(需要89a版本),應(yīng)用程序可以在這里定義自己的標(biāo)識(shí)、信息等,組成:BYTE76543210BIT1擴(kuò)展塊標(biāo)識(shí)Extension Introducer - 標(biāo)識(shí)這是一個(gè)擴(kuò)展塊,固定值0x212圖形控制擴(kuò)展標(biāo)簽Application Extension Label - 標(biāo)識(shí)這是一個(gè)應(yīng)用程序擴(kuò)展塊,固定值0xFF3塊大小Block

18、 Size - 塊大小,固定值114應(yīng)用程序標(biāo)識(shí)符Application Identifier - 用來鑒別應(yīng)用程序自身的標(biāo)識(shí)(8個(gè)連續(xù)ASCII字符)56789101112應(yīng)用程序鑒別碼Application Authentication Code - 應(yīng)用程序定義的特殊標(biāo)識(shí)碼(3個(gè)連續(xù)ASCII字符)1314N.應(yīng)用程序自定義數(shù)據(jù)塊 - 一個(gè)或多個(gè)數(shù)據(jù)塊組成,保存應(yīng)用程序自己定義的數(shù)據(jù)應(yīng)用程序數(shù)據(jù).N+1塊終結(jié)器lock Terminator - 標(biāo)識(shí)注釋塊結(jié)束,固定值0文件結(jié)尾部分文件終結(jié)器(Trailer)這一部分只有一個(gè)值為0的字節(jié),標(biāo)識(shí)一個(gè)GIF文件結(jié)束.BYTE765432101

19、文件終結(jié) GIF Trailer - 標(biāo)識(shí)GIF文件結(jié)束,固定值0x3B2.LZW算法和GIF數(shù)據(jù)壓縮GIF文件的圖象數(shù)據(jù)使用了可變長(zhǎng)度編碼的LZW壓縮算法(Variable-Length_Code LZW Compression),這是從LZW(Lempel Ziv Compression)壓縮算法演變過來的,通過壓縮原始數(shù)據(jù)的重復(fù)部分來達(dá)到減少文件大小的目的。LZW的壓縮原理:先來解釋一下幾個(gè)基本概念:LZW壓縮有三個(gè)重要的對(duì)象:數(shù)據(jù)流(CharStream)、編碼流(CodeStream)和編譯表(String Table)。在編碼時(shí),數(shù)據(jù)流是輸入對(duì)象(圖象的光柵數(shù)據(jù)序列),編碼流就是輸

20、出對(duì)象(存儲(chǔ)在GIF文件的圖象數(shù)據(jù));在解碼時(shí),編碼流則是輸入對(duì)象,數(shù)據(jù)流是輸出對(duì)象;而編譯表是在編碼和解碼時(shí)都須要用借助的對(duì)象。字符(Character):最基礎(chǔ)的數(shù)據(jù)元素,在文本文件中就是一個(gè)字節(jié), 字符串(String):由幾個(gè)連續(xù)的字符組成;前綴(Prefix):也是一個(gè)字符串,不過通常用在另一個(gè)字符的前面,而且它的長(zhǎng)度可以為0;根(Root):?jiǎn)蝹€(gè)長(zhǎng)度的字符串;編碼(Code):一個(gè)數(shù)字,按照固定長(zhǎng)度(編碼長(zhǎng)度)從編碼流中取出,也是編碼表的映射值;圖案:一個(gè)字符串,按不定長(zhǎng)度從數(shù)據(jù)流中讀出。LZW壓縮原理,就是先提取原始圖象數(shù)據(jù)中的不同圖案,基于這些圖案創(chuàng)建一個(gè)編譯表,然后用編譯表中

21、的圖案索引來替代原始光柵數(shù)據(jù)中的相應(yīng)圖案,減少原始數(shù)據(jù)大小??雌饋砗驼{(diào)色板圖象的實(shí)現(xiàn)原理差不多,但是應(yīng)該注意到的是,我們這里的編譯表不是事先創(chuàng)建好的,而是根據(jù)原始圖象數(shù)據(jù)動(dòng)態(tài)創(chuàng)建的,解碼時(shí)還要從已編碼的數(shù)據(jù)中還原出原來的編譯表(GIF文件中是不攜帶編譯表信息的),為了更好理解編解碼原理,我們來看看具體的處理過程:編碼器(Compressor)編碼數(shù)據(jù),第一步,初始化一個(gè)編譯表,假設(shè)這個(gè)編譯表的大小是12位的,也就是最多有4096個(gè)單位,另外假設(shè)我們有32個(gè)不同的字符(也可以認(rèn)為圖象的每個(gè)像素最多有32種顏色),表示為a,b,c,d,e.,初始化編譯表:第0項(xiàng)為a,第1項(xiàng)為b,第2項(xiàng)為c.一直到

22、第31項(xiàng),我們把這32項(xiàng)就稱為根。開始編譯,先定義一個(gè)前綴對(duì)象Current Prefix,記為.c.,現(xiàn)在它是空的,然后定義一個(gè)當(dāng)前字符串Current String,標(biāo)記為.c.k,.c.就為Current Prefix,k就為當(dāng)前讀取字符。現(xiàn)在來讀取數(shù)據(jù)流的第一個(gè)字符,假如為p,那么Current String就等于.c.p(由于.c.為空,實(shí)際上值就等于p),現(xiàn)在在編譯表中查找有沒有Current String的值,由于p就是一個(gè)根,我們已經(jīng)初始了32個(gè)根,當(dāng)然可以找到,把p設(shè)為Current Prefix的值,不做任何事繼續(xù)讀取下一個(gè)字符,假設(shè)為q,Current String就等于

23、.c.q(也就是pq),看看在編譯表中有沒有該值,當(dāng)然。沒有,這時(shí)我們要做下面的事情:將Current String的值(也就是pq)添加到編譯表的第32項(xiàng),把Current Prefix的值(也就是p)在編譯表中的索引輸出到編碼流,修改Current Prefix為q。繼續(xù)往下讀,如果在編譯表中可以查找到Current String的值(.c.k),則把Current String的值(.c.k)賦予Current Prefix;如果查找不到,則添加Current String的值(.c.k)到編譯表,把Current Prefix的值(.c.)在編譯表中所對(duì)應(yīng)的索引輸出到編碼流,同時(shí)修改C

24、urrent Prefix為k ,這樣一直循環(huán)下去直到數(shù)據(jù)流結(jié)束。偽代碼看起來就像下面這樣:Initialize String Table;.c. = Empty;.c.k = First Character in CharStream;while (.c.k != EOF )if ( .c.k is in the StringTable).c. = .c.k;elseadd .c.k to the StringTable;Output the Index of .c. in the StringTable to the CodeStream;.c. = k;.c.k = Next Chara

25、cter in CharStream;Output the Index of .c. in the StringTable to the CodeStream;來看一個(gè)具體的例子,我們有一個(gè)字母表a,b,c,d.有一個(gè)輸入的字符流abacaba?,F(xiàn)在來初始化編譯表:#0=a,#1=b,#2=c,#3=d.現(xiàn)在開始讀取第一個(gè)字符a,.c.a=a,可以在在編譯表中找到,修改.c.=a;不做任何事繼續(xù)讀取第二個(gè)字符b,.c.b=ab,在編譯表中不能找,那么添加.c.b到編譯表:#4=ab,同時(shí)輸出.c.(也就是a)的索引#0到編碼流,修改.c.=b;讀下一個(gè)字符a,.c.a=ba,在編譯表中不能找到

26、:添加編譯表#5=ba,輸出.c.的索引#1到編碼流,修改.c.=a;讀下一個(gè)字符c,.c.c=ac,在編譯表中不能找到:添加編譯表#6=ac,輸出.c.的索引#0到編碼流,修改.c.=c;讀下一個(gè)字符a,.c.c=ca,在編譯表中不能找到:添加編譯表#7=ca,輸出.c.的索引#2到編碼流,修改.c.=a;讀下一個(gè)字符b,.c.b=ab,編譯表的#4=ab,修改.c.=ab;讀取最后一個(gè)字符a,.c.a=aba,在編譯表中不能找到:添加編譯表#8=aba,輸出.c.的索引#4到編碼流,修改.c.=a;好了,現(xiàn)在沒有數(shù)據(jù)了,輸出.c.的值a的索引#0到編碼流,這樣最后的輸出結(jié)果就是:#0#1#

27、0#2#4#0.解碼器(Decompressor)好了,現(xiàn)在來看看解碼數(shù)據(jù)。數(shù)據(jù)的解碼,其實(shí)就是數(shù)據(jù)編碼的逆向過程,要從已經(jīng)編譯的數(shù)據(jù)(編碼流)中找出編譯表,然后對(duì)照編譯表還原圖象的光柵數(shù)據(jù)。首先,還是要初始化編譯表。GIF文件的圖象數(shù)據(jù)的第一個(gè)字節(jié)存儲(chǔ)的就是LZW編碼的編碼大?。ㄒ话愕扔趫D象的位數(shù)),根據(jù)編碼大小,初始化編譯表的根條目(從0到2的編碼大小次方),然后定義一個(gè)當(dāng)前編碼Current Code,記作code,定義一個(gè)Old Code,記作old。讀取第一個(gè)編碼到code,這是一個(gè)根編碼,在編譯表中可以找到,把該編碼所對(duì)應(yīng)的字符輸出到數(shù)據(jù)流,old=code;讀取下一個(gè)編碼到cod

28、e,這就有兩種情況:在編譯表中有或沒有該編碼,我們先來看第一種情況:先輸出當(dāng)前編碼code所對(duì)應(yīng)的字符(串)到數(shù)據(jù)流,然后把old所對(duì)應(yīng)的字符(串)當(dāng)成prefix .,當(dāng)前編碼code所對(duì)應(yīng)的字符(串)的第一個(gè)字符當(dāng)成k,組合起來當(dāng)前字符串Current String就為.k,把.k添加到編譯表,讀下一個(gè)編碼;我們來看看在編譯表中找不到該編碼的情況,回想一下編碼情況:如果數(shù)據(jù)流中有一個(gè)p.p.pq這樣的字符串,p.在編譯表中而p.p不在,編譯器將輸出p.的索引而添加p.p到編譯表,下一個(gè)字符串p.p可以在編譯表中找到而p.pq不在編譯表,同樣將輸出p.p的索引值而添加p.pq到編譯表,這樣看

29、來,解碼器總比編碼器慢一步,當(dāng)我們遇到p.p所對(duì)應(yīng)的索引時(shí),我們不知到該索引對(duì)應(yīng)的字符串(在解碼器的編譯表中還沒有該索引,事實(shí)上,這個(gè)索引將在下一步添加),這時(shí)需要用猜測(cè)法:現(xiàn)在假設(shè)上面的p.所對(duì)應(yīng)的索引值是#58,那么上面的字符串經(jīng)過編譯之后是#58#59,我們?cè)诮獯a器中讀到#59時(shí),編譯表的最大索引只有#58,#59所對(duì)應(yīng)的字符串就等于#58所對(duì)應(yīng)的字符串(也就是p.)加上它的第一個(gè)字符(也就是p),也就是p.p。事實(shí)上,這種猜測(cè)法是很準(zhǔn)確(有點(diǎn)不好理解,仔細(xì)想一想吧)。上面的解碼過程用偽代碼表示就像下面這樣:Initialize String Table;code = First Cod

30、e in the CodeStream;Output the String for code to the CharStream;old = code;code = Next Code in the CodeStream;while (code != EOF )if ( code is in the StringTable)Output the String for code to the CharStream; / 輸出code所對(duì)應(yīng)的字符串. = translation for old; / old所對(duì)應(yīng)的字符串k = first character of translation for code; / code所對(duì)應(yīng)的字符串的第一個(gè)字符add .k to the StringTable;old = code; else. = translation for old; k = first character of .; Output .

溫馨提示

  • 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)論