锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产成人,国产女优一区,宅男精品视频http://m.shnenglu.com/swo2006/category/3205.htmlzh-cnTue, 20 May 2008 04:20:47 GMTTue, 20 May 2008 04:20:47 GMT60鏃犳崯鏁版嵁鍘嬬緝http://m.shnenglu.com/swo2006/articles/11520.htmlswoswoMon, 21 Aug 2006 06:20:00 GMThttp://m.shnenglu.com/swo2006/articles/11520.htmlhttp://m.shnenglu.com/swo2006/comments/11520.htmlhttp://m.shnenglu.com/swo2006/articles/11520.html#Feedback1http://m.shnenglu.com/swo2006/comments/commentRss/11520.htmlhttp://m.shnenglu.com/swo2006/services/trackbacks/11520.html鏁版嵁鍘嬬緝鐨勮搗婧愯姣旇綆楁満鐨勮搗婧愭棭寰楀錛屾暟鎹帇緙╂妧鏈湪璁$畻鏈烘妧鏈殑钀岃娊鏃舵湡灝卞凡緇忚鎻愪笂浜嗚浜嬫棩紼嬶紝鍐涗簨縐戝瀹躲佹暟瀛﹀銆佺數瀛愬瀹朵竴鐩村湪鐮旂┒鏈夊叧淇℃伅濡備綍琚珮鏁堝瓨鍌ㄥ拰浼犻掔殑闂銆傞殢鐫淇℃伅璁虹殑浜х敓鍜屽彂灞曪紝鏁版嵁鍘嬬緝涔熺敱鐑棬璇濋婕斿彉鎴愪簡鐪熸鐨勬妧鏈?br />
鏁版嵁鍘嬬緝鍙垎鎴愪袱縐嶇被鍨嬶紝涓縐嶅彨鍋氭棤鎹熷帇緙╋紝鍙︿竴縐嶅彨鍋氭湁鎹熷帇緙┿?br />鏃? 鎹熷帇緙╂槸鎸囦嬌鐢ㄥ帇緙╁悗鐨勬暟鎹繘琛岄噸鏋?鎴栬呭彨鍋氳繕鍘燂紝瑙e帇緙?錛岄噸鏋勫悗鐨勬暟鎹笌鍘熸潵鐨勬暟鎹畬鍏ㄧ浉鍚岋紱鏃犳崯鍘嬬緝鐢ㄤ簬瑕佹眰閲嶆瀯鐨勪俊鍙蜂笌鍘熷淇″彿瀹屽叏涓鑷寸殑鍦? 鍚堛傜鐩樻枃浠剁殑鍘嬬緝灝辨槸涓涓緢甯歌鐨勪緥瀛愩傛牴鎹洰鍓嶇殑鎶鏈按騫籌紝鏃犳崯鍘嬬緝綆楁硶涓鑸彲浠ユ妸鏅氭枃浠剁殑鏁版嵁鍘嬬緝鍒板師鏉ョ殑1/2锝?/4銆?br />鏈夋崯鍘嬬緝鏄寚浣跨敤鍘嬬緝鍚庣殑鏁版嵁榪涜閲嶆瀯錛岄噸鏋勫悗鐨勬暟鎹笌鍘熸潵鐨勬暟鎹湁鎵涓嶅悓錛屼絾涓嶄細璁╀漢瀵瑰師濮嬭祫鏂?br />琛? 杈劇殑淇℃伅閫犳垚璇В銆傛湁鎹熷帇緙╅傜敤浜庨噸鏋勪俊鍙蜂笉涓瀹氶潪瑕佸拰鍘熷淇″彿瀹屽叏鐩稿悓鐨勫満鍚堛備緥濡傦紝鍥懼儚鍜屽0闊崇殑鍘嬬緝灝卞彲浠ラ噰鐢ㄦ湁鎹熷帇緙╋紝鍥犱負鍏朵腑鍖呭惈鐨勬暟鎹線寰澶氫簬 鎴戜滑鐨勮瑙夌郴緇熷拰鍚緋葷粺鎵鑳芥帴鏀剁殑淇℃伅錛屼涪鎺変竴浜涙暟鎹屼笉鑷充簬瀵瑰0闊蟲垨鑰呭浘鍍忔墍琛ㄨ揪鐨勬剰鎬濅駭鐢熻瑙o紝浣嗗彲澶уぇ鎻愰珮鍘嬬緝姣斻?br />
鍘嬬緝鎶鏈ぇ鑷村彲浠ユ寜鐓т互涓嬬殑鏂規硶鍒嗙被錛?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 鍘嬬緝鎶鏈?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽/------------------------------\
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽閫氱敤鏃犳崯鏁版嵁鍘嬬緝 聽聽聽聽聽聽聽聽聽聽聽聽澶氬獟浣撴暟鎹帇緙?澶у涓烘湁鎹熷帇緙?
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 | 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽/----------------\聽 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽/------------------------------------\
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鍩轟簬緇熻聽聽聽聽聽聽聽聽聽 鍩轟簬瀛楀吀聽聽聽闊抽鍘嬬緝聽聽聽聽聽聽聽聽 鍥懼儚鍘嬬緝聽聽聽聽聽聽聽聽聽聽聽聽聽聽 瑙嗛鍘嬬緝
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 妯″瀷鐨勫帇 聽聽聽聽聽聽聽聽妯″瀷鐨勫帇 聽聽聽聽聽聽聽聽| 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽| 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽緙╂妧鏈?聽聽聽聽聽聽聽聽聽聽聽聽緙╂妧鏈?聽聽聽聽聽聽聽聽MP3絳?聽聽聽聽/-------------------\聽聽聽聽聽聽聽聽聽聽聽聽AVI
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽| 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽|聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽浜屽?鐏板害 褰╄壊 鐭㈤噺聽聽聽聽聽聽 MPEG2絳?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽/------\ 聽聽聽聽聽聽聽聽/-------------\聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鍥懼儚 鍥懼儚 鍥懼儚 鍥懼儚
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽Huffman 綆楁湳 LZ77 LZ78 LZW聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽| 聽聽聽聽聽聽聽聽|聽聽聽聽聽聽聽聽 聽|聽聽聽聽聽聽聽聽\聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽緙栫爜 聽聽聽聽緙栫爜 聽聽聽聽\-------------/聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽浼犵湡鏈?FELICS GIF 聽聽聽聽聽聽聽聽PostScript
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽| 聽聽聽聽聽聽聽聽聽聽聽聽|聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 | 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鏍囧噯 聽聽聽聽JPEG絳?JPEG絳?Windows WMF絳?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽UNIX涓?聽聽聽聽聽聽聽聽聽 鎺ヨ繎鏃犳崯聽聽聽聽聽聽聽PKZIP銆丩Harc銆丄RJ銆?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鐨凜OMPACT聽 鍘嬬緝鏋侀檺聽聽聽聽聽聽聽聽UNIX涓嬬殑COMPRESS
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽紼嬪簭絳壜犅犅犅犅犅犅犅犅犅犅犅?鐨勯珮綰у簲鐢犅犅犅犵▼搴忕瓑


閫氱敤鏃犳崯鏁版嵁鍘嬬緝鐨勫巻鍙?br />縐戝瀹跺湪鐮旂┒涓彂鐜幫紝澶у鏁頒俊鎭殑琛ㄨ揪閮藉瓨鍦ㄧ潃涓瀹氱殑鍐椾綑搴︼紝閫氳繃閲囩敤涓瀹氱殑妯″瀷鍜岀紪鐮佹柟娉曪紝鍙互
闄嶄綆榪欑鍐椾綑搴︺傝礉灝斿疄楠屽鐨?Claude Shannon 鍜?MIT 鐨?R.M.Fano 鍑犱箮鍚屾椂鎻愬嚭浜嗘渶鏃╃殑瀵圭鍙瘋繘琛屾湁
鏁堢紪鐮佷粠鑰屽疄鐜版暟鎹帇緙╃殑 Shannon-Fano 緙栫爜鏂規硶銆?br />
D.A.Huffman 浜?952騫寸涓嬈″彂琛ㄤ簡浠栫殑璁烘枃鈥滄渶灝忓啑浣欎唬鐮佺殑鏋勯犳柟娉曗?A Method for the Construction of Minimum Redundancy Codes)銆備粠姝わ紝鏁版嵁鍘嬬緝寮濮嬪湪鍟嗕笟紼嬪簭涓疄鐜板茍琚簲鐢ㄥ湪璁稿鎶鏈鍩熴俇NIX 緋葷粺涓婁竴涓帇緙╃▼搴?COMPACT 灝辨槸 Huffman 0 闃惰嚜閫傚簲緙栫爜鐨勫叿浣撳疄鐜般?0 騫翠唬鍒濓紝Huffman緙栫爜鍙堝湪CP/M 鍜孌OS 緋葷粺涓疄鐜幫紝鍏朵唬琛ㄧ▼搴忓彨 SQ銆傚湪鏁版嵁鍘嬬緝棰嗗煙錛孒uffman 鐨勮繖涓璁烘枃浜嬪疄涓婂紑鍒涗簡鏁版嵁鍘嬬緝鎶鏈竴涓煎緱鍥炲繂鐨勬椂浠o紝60 騫翠唬銆?0 騫翠唬涔冭嚦 80 騫翠唬鐨勬棭鏈燂紝鏁版嵁鍘嬬緝棰嗗煙鍑犱箮涓鐩磋 Huffman 緙栫爜鍙婂叾鍒嗘敮鎵鍨勬柇銆傚鏋滀笉鏄悗闈㈠皢瑕佹彁鍒扮殑閭d袱涓互鑹插垪浜猴紝涔熻鎴戜滑浠婂ぉ榪樿鍦? Huffman緙栫爜鐨?0 鍜?1 鐨勭粍鍚堜腑嫻佽繛蹇樿繑銆?br />
80騫翠唬錛屾暟瀛﹀浠笉婊¤凍浜?Huffman 緙栫爜涓殑鏌愪簺鑷村懡寮辯偣錛屼粬浠粠鏂扮殑瑙掑害鍏ユ墜錛岄伒寰?Huffman 緙栫爜鐨勪富瀵兼濇兂錛岃璁″嚭鍙︿竴縐嶆洿涓虹簿紜紝鏇磋兘鎺ヨ繎淇℃伅璁轟腑鈥滅喌鈥濇瀬闄愮殑緙栫爜鏂規硶鈥斺旂畻鏈紪鐮併傚嚟鍊熺畻鏈紪鐮佺殑綺懼璁捐鍜屽崜瓚婅〃鐜幫紝浜轟滑緇堜簬鍙互鍚戠潃鏁版嵁鍘? 緙╃殑鏋侀檺鍓嶈繘浜嗐傚彲浠ヨ瘉鏄庯紝綆楁湳緙栫爜寰楀埌鐨勫帇緙╂晥鏋滃彲浠ユ渶澶у湴鍑忓皬淇℃伅鐨勫啑浣欏害錛岀敤鏈灝戦噺鐨勭鍙風簿紜〃杈懼師濮嬩俊鎭唴瀹廣傚綋鐒訛紝綆楁湳緙栫爜鍚屾椂涔熺粰紼嬪簭鍛樺拰璁? 綆楁満甯︽潵浜嗘柊鐨勬寫鎴橈細瑕佸疄鐜板拰榪愯綆楁湳緙栫爜錛岄渶瑕佹洿涓鴻壈鑻︾殑緙栫▼鍔沖姩鍜屾洿鍔犲揩閫熺殑璁$畻鏈虹郴緇熴備篃灝辨槸錛屽湪鍚屾牱鐨勮綆楁満緋葷粺涓婏紝綆楁湳緙栫爜铏界劧鍙互寰楀埌鏈濂界殑 鍘嬬緝鏁堟灉錛屼絾鍗磋娑堣椾篃璁稿嚑鍗佸嶇殑璁$畻鏃躲傝繖灝辨槸涓轟粈涔堢畻鏈紪鐮佷笉鑳藉湪鎴戜滑鏃ュ父浣跨敤鐨勫帇緙╁伐鍏蜂腑瀹炵幇鐨勪富瑕佸師鍥犮?br />
閭d箞錛岃兘涓嶈兘鏃㈠湪鍘嬬緝鏁? 鏋滀笂瓚呰秺 Huffman錛屽張涓嶅鍔犵▼搴忓緋葷粺璧勬簮鍜屾椂闂寸殑闇姹傚憿錛熸垜浠繀欏繪劅璋笅闈㈠皢瑕佷粙緇嶇殑涓や釜浠ヨ壊鍒椾漢銆傜洿鍒?1977 騫達紝鏁版嵁鍘嬬緝鐨勭爺絀跺伐浣滀富瑕侀泦涓簬鐔點佸瓧絎﹀拰鍗曡瘝棰戠巼浠ュ強緇熻妯″瀷絳夋柟闈紝鐮旂┒鑰呬滑涓鐩村湪緇炲敖鑴戞眮涓轟嬌鐢℉uffman緙栫爜鐨勭▼搴忔壘鍑烘洿蹇佹洿濂界殑鏀硅繘鏂? 娉曘?977 騫翠互鍚庯紝涓鍒囬兘鏀瑰彉浜嗐?br />
1977 騫達紝浠ヨ壊鍒椾漢 Jacob Ziv 鍜?Abraham Lempel 鍙戣〃浜嗚鏂団滈『搴忔暟鎹帇緙╃殑涓涓氱敤綆楁硶鈥?A Universal Alogrithem for Sequential Data Compression)銆?978 騫達紝浠栦滑鍙戣〃浜嗚璁烘枃鐨勭畫綃団滈氳繃鍙彉姣旂巼緙栫爜鐨勭嫭绔嬪簭鍒楃殑鍘嬬緝鈥?Compression of Individual Sequences via Variable-Rate Coding)銆傚湪榪欎袱綃囪鏂囦腑鎻愬嚭鐨勫帇緙╂妧鏈垎鍒縐頒負 LZ77 鍜?LZ78 (涓嶇煡涓轟粈涔堬紝浣滆呭悕瀛楃殑棣栧瓧姣嶈鍊掔疆浜?銆傜畝鍗曞湴璇達紝榪欎袱縐嶅帇緙╂柟娉曠殑鎬濊礬瀹屽叏涓嶅悓浜庝粠 Shannon 鍒?Huffman 鍒扮畻鏈帇緙╃殑浼犵粺鎬濊礬錛屼漢浠皢鍩轟簬榪欎竴鎬濊礬鐨勭紪鐮佹柟娉曠О浣溾滃瓧鍏糕濆紡緙栫爜銆傚瓧鍏稿紡緙栫爜涓嶄絾鍦ㄥ帇緙╂晥鏋滀笂澶уぇ瓚呰繃浜? Huffman錛岃屼笖錛屽浜庡ソ鐨勫疄鐜幫紝鍏跺帇緙╁拰瑙e帇緙╃殑閫熷害涔熷紓甯告儕浜恒?br />
1984 騫達紝Terry Welch 鍙戣〃浜嗗悕涓衡滈珮鎬ц兘鏁版嵁鍘嬬緝鎶鏈?A Technique for High-Performance Data Compression)鐨勮鏂囷紝鎻忚堪浜嗕粬鍦?Sperry Research Center(鐜板湪鏄疷nisys鐨勪竴閮ㄥ垎)鐨勭爺絀舵垚鏋溿備粬瀹炵幇浜哃Z78 綆楁硶鐨勪竴涓彉縐?鈥斺?LZW銆侺ZW 緇ф壙浜?LZ77 鍜?LZ78 鍘嬬緝鏁堟灉濂姐侀熷害蹇殑浼樼偣錛岃屼笖鍦ㄧ畻娉曟弿榪頒笂鏇村鏄撹浜轟滑鎺ュ彈錛堟湁鐨勭爺絀惰呰涓烘槸鐢變簬 Welch 鐨勮鏂囨瘮 Ziv 鍜?Lempel 鐨勬洿瀹規槗鐞嗚В錛夛紝瀹炵幇涔熸瘮杈冪畝鍗曘備笉涔咃紝UNIX 涓婂嚭鐜頒簡浣跨敤 LZW 綆楁硶鐨?Compress 紼嬪簭錛岃紼嬪簭鎬ц兘浼樿壇錛屽茍鏈夐珮姘村鉤鐨勬枃妗o紝寰堝揩鎴愪負浜?UNIX 涓栫晫鐨勫帇緙╃▼搴忔爣鍑嗐傜揣闅忓叾鍚庣殑鏄?MS-DOS 鐜涓嬬殑ARC紼嬪簭( System Enhancement Associates, 1985 )錛岃繕鏈夎薄 PKWare銆丳KARC 絳変豢鍒跺搧銆侺Z78鍜孡ZW涓鏃墮棿緇熸不浜哢NIX鍜孌OS涓ゅぇ騫沖彴銆?br />
80 騫翠唬涓湡浠ュ悗錛屼漢浠 LZ77 榪涜浜嗘敼榪涳紝闅忎箣璇炵敓浜嗕竴鎵規垜浠粖澶╄繕鍦ㄥぇ閲忎嬌鐢ㄧ殑鍘嬬緝紼嬪簭銆侶aruyasu Yoshizaki(Yoshi)鐨凩Harc鍜孯obert Jung鐨凙RJ鏄叾涓袱涓憲鍚嶇殑渚嬪瓙銆侺Z77寰椾互鍜孡Z78銆丩ZW涓璧峰瀯鏂綋浠婄殑閫氱敤鏁版嵁鍘嬬緝棰嗗煙銆?br />
鐩墠錛屽熀浜庡瓧鍏告柟寮忕殑鍘嬬緝宸茬粡鏈変簡涓涓騫挎硾璁ゅ彲鐨勬爣鍑嗭紝浠庡彜鑰佺殑PKZip鍒扮幇鍦ㄧ殑WinZip錛岀壒鍒槸闅?br />鐫Internet涓婃枃浠朵紶杈撶殑嫻佽錛孼IP 鏍煎紡鎴愪負浜嗕簨瀹炰笂鐨勬爣鍑嗭紝娌℃湁鍝竴縐嶉氱敤鐨勬枃浠跺帇緙┿佸綊妗g郴緇熶笉鏀?br />鎸?ZIP 鏍煎紡銆傛湰绔犱富瑕佷粙緇嶇洰鍓嶇敤寰楁渶澶氬拰鎶鏈渶鎴愮啛鐨勬棤鎹熷帇緙╃紪鐮佹妧鏈紝鍖呮嫭鍖呭惈闇嶅か鏇?Huffman)緙栫爜銆佺畻鏈紪鐮併丷LE緙栫爜鍜岃瘝鍏哥紪鐮?銆傛敞鎰忔湁涓閮ㄥ垎鍘嬬緝綆楁硶鍙楀埌緹庡浗涓撳埄娉曠殑淇濇姢錛堜緥濡?LZW 綆楁硶鐨勬煇浜涢儴鍒嗗拰楂橀樁綆楁湳鍘嬬緝綆楁硶鐨勬煇浜涚粏鑺傜瓑錛夈?br />
4.1 浠欏啘-鑼冭涓庨湇澶浖緙栫爜
4.1.1 浠欏啘-鑼冭錛圫hannon-Fano錛夌紪鐮?br />浠欏啘-鑼冭緙栫爜綆楁硶闇瑕佺敤鍒頒笅闈袱涓熀鏈蹇碉細
1. Entropy(鐔?
(1) 鐔墊槸淇℃伅閲忕殑搴﹂噺鏂規硶錛岃〃紺轟竴鏉′俊鎭腑鐪熸闇瑕佺紪鐮佺殑淇℃伅閲忋備簨浠跺彂鐢熺殑鍙兘鎬ц秺灝忥紙鏁板涓婂氨
鏄鐜囪秺灝忥級錛岃〃紺烘煇涓浜嬩歡鍑虹幇鐨勬秷鎭秺澶氥?br />(2) 鏌愪釜浜嬩歡鐨勪俊鎭噺鐢↖i=-log2 pi琛ㄧず錛堟湁鏃剁О涓簊urprise錛夛紝 鍏朵腑pi涓虹i涓簨浠剁殑姒傜巼錛? pi 1瀵規暟浠?涓哄簳鏃訛紝鐔電殑鍗曚綅鏄?bits"銆?br />2. 淇℃簮S鐨勭喌
鎸夌収浠欏啘(Shannon)鐨勭悊璁猴紝淇℃簮S鐨勭喌瀹氫箟涓?br />鍏朵腑pi鏄鍙穝i鍦⊿涓嚭鐜扮殑姒傜巼錛沴og2(1/ pi)琛ㄧず鍖呭惈鍦╯i涓殑淇℃伅閲忥紝涔熷氨鏄紪鐮乻i鎵闇瑕佺殑浣嶆暟銆?br />渚嬪錛屼竴騫呯敤256綰х伆搴﹁〃紺虹殑鍥懼儚錛屽鏋滄瘡涓涓薄绱犵偣鐏板害鐨勬鐜囧潎涓簆i=1/256錛岀紪鐮佹瘡涓涓薄绱犵偣灝遍渶
瑕?浣嶃傦紙鏈澶х喌鍒嗗竷錛?br />鏈灝忕喌鍒嗗竷錛?闄や簡涓涓鍙峰鍏朵綑絎﹀彿鐨勬鐜囧叏涓?錛孒錛?bits.錛堝畾涔?log20錛?錛?br />
渚嬪錛屽涓嬮潰榪欐潯鍙嚭鐜頒簡 a b c 涓変釜瀛楃鐨勫瓧絎︿覆錛歛abbaccbaa錛屽瓧絎︿覆闀垮害涓?10錛屽瓧絎?a b c 鍒?br />鍒嚭鐜頒簡 5 3 2 嬈★紝鍒?a b c 鍦ㄤ俊鎭腑鍑虹幇鐨勬鐜囧垎鍒負 0.5 0.3 0.2錛屼粬浠殑鐔靛垎鍒負錛?br />Ea = -log2(0.5) = 1
Eb = -log2(0.3) = 1.737
Ec = -log2(0.2) = 2.322
鏁存潯淇℃伅鐨勭喌涔熷嵆琛ㄨ揪鏁翠釜瀛楃涓查渶瑕佺殑浣嶆暟涓猴細
Ea * 5 + Eb * 3 + Ec * 2 = 14.855 浣?br />濡傛灉鐢ㄨ綆楁満涓父鐢ㄧ殑 ASCII 緙栫爜錛岃〃紺轟笂闈㈢殑瀛楃涓查渶瑕佹暣鏁?0浣嶏紒淇℃伅涓轟粈涔堣兘琚帇緙╄屼笉涓㈠け鍘?br />鏈夌殑淇℃伅鍐呭鍛紵綆鍗曞湴璁詫紝鐢ㄨ緝灝戠殑浣嶆暟琛ㄧず杈冮綣佸嚭鐜扮殑絎﹀彿錛岃繖灝辨槸鏁版嵁鍘嬬緝鐨勫熀鏈噯鍒欍傦紙鎬庢牱鐢?0
1 榪欐牱鐨勪簩榪涘埗鏁扮爜琛ㄧず闆剁偣鍑犱釜浜岃繘鍒朵綅鍛紵紜疄寰堝洶闅撅紝浣嗕笉鏄病鏈夊姙娉曘備竴鏃︽壘鍒頒簡鍑嗙‘琛ㄧず闆剁偣鍑犱釜
浜岃繘鍒朵綅鐨勬柟娉曪紝灝辨帴榪戞棤鎹熷帇緙╃殑鏋侀檺浜嗐傦級
[渚?.1] 鏈変竴騫?0涓薄绱犵粍鎴愮殑鐏板害鍥懼儚錛岀伆搴﹀叡鏈?綰э紝鍒嗗埆鐢ㄧ鍙稟銆丅銆丆銆丏鍜孍琛ㄧず錛?0涓薄绱犱腑鍑?br />鐜扮伆搴鐨勮薄绱犳暟鏈?5涓紝鍑虹幇鐏板害B鐨勮薄绱犳暟鏈?涓紝鍑虹幇鐏板害C鐨勮薄绱犳暟鏈?涓瓑絳夛紝濡傝〃4-01鎵紺恒?br />濡傛灉鐢?涓綅琛ㄧず榪?涓瓑綰х殑鐏板害鍊鹼紝涔熷氨鏄瘡涓薄绱犵敤3浣嶈〃紺?絳夐暱緙栫爜)錛岀紪鐮佽繖騫呭浘鍍忔誨叡闇瑕?20
浣嶃?br />琛?-01 絎﹀彿鍦ㄥ浘鍍忎腑鍑虹幇鐨勬暟鐩?br />鎸夌収浠欏啘鐞嗚錛岃繖騫呭浘鍍忕殑鐔典負 H(S)=(15/40)脳log2(40/15) + (7/40)脳log2(40/7) +鈥?+ (5/40)
脳log2(40/5) = 2.196
榪欏氨鏄姣忎釜絎﹀彿鐢?.196浣嶈〃紺猴紝40涓薄绱犻渶鐢?7.84浣嶃?br />鏈鏃╅槓榪板拰瀹炵幇榪欑緙栫爜鐨勬槸Shannon(1948騫?鍜孎ano(1949騫?錛屽洜姝よ縐頒負浠欏啘-鑼冭(Shannon-Fano)綆?br />娉曘傝繖縐嶆柟娉曢噰鐢ㄤ粠涓婂埌涓嬬殑鏂規硶榪涜緙栫爜銆?br />棣栧厛鎸夌収絎﹀彿鍑虹幇鐨勯搴︽垨姒傜巼鎺掑簭錛屼緥濡傦紝A錛孊錛孋錛孌鍜孍錛屽琛?-02鎵紺恒?br />鐒跺悗浣跨敤閫掑綊鏂規硶鍒嗘垚涓や釜閮ㄥ垎錛屾瘡涓閮ㄥ垎鍏鋒湁榪戜技鐩稿悓鐨勬鏁幫紝濡傚浘4-01鎵紺恒?br />鎸夌収榪欑鏂規硶榪涜緙栫爜寰楀埌鐨勬諱綅鏁頒負91錛屽疄闄呯殑鍘嬬緝姣旂害涓?.3 : 1銆?br />琛?-02 Shannon-Fano綆楁硶涓句緥琛?br />絎?鍙?A B C D E
鍑虹幇鐨勬鏁?15 7 7 6 5
絎﹀彿 鍑虹幇鐨勬鏁?pi) log2(1/pi) 鍒嗛厤鐨勪唬鐮?闇瑕佺殑浣嶆暟
A 15 (0.375) 1.4150 00 30
B 7 (0.175) 2.5145 01 14
C 7 (0.175) 2.5145 10 14
D 6 (0.150) 2.7369 110 18
E 5 (0.125) 3.0000 111 15
絎?4 欏?br />4
鍥?-01 浠欏啘-鑼冭綆楁硶緙栫爜涓句緥
4.1.2 闇嶅か鏇?Huffman)緙栫爜
闇嶅か鏇煎湪1952騫存彁鍑轟簡鍙︿竴縐嶇紪鐮佹柟娉曪紝鍗充粠涓嬪埌涓婄殑緙栫爜鏂規硶銆傜幇浠ヤ竴涓叿浣撶殑渚嬪瓙璇存槑瀹冪殑緙栫爜姝?br />楠わ細
(1) 鍒濆鍖栵紝鏍規嵁絎﹀彿姒傜巼鐨勫ぇ灝忔寜鐢卞ぇ鍒板皬欏哄簭瀵圭鍙瘋繘琛屾帓搴忥紝濡傝〃4-03鍜屽浘4-02鎵紺恒?br />(2) 鎶婃鐜囨渶灝忕殑涓や釜絎﹀彿緇勬垚涓涓妭鐐癸紝濡傚浘4-02涓殑D鍜孍緇勬垚鑺傜偣P1銆?br />(3) 閲嶅姝ラ2錛屽緱鍒拌妭鐐筆2銆丳3鍜孭4錛屽艦鎴愪竴媯碘滄爲鈥濓紝鍏朵腑鐨凱4縐頒負鏍硅妭鐐廣?br />(4) 浠庢牴鑺傜偣P4寮濮嬪埌鐩稿簲浜庢瘡涓鍙風殑鈥滄爲鍙垛濓紝浠庝笂鍒頒笅鏍囦笂鈥?鈥?涓婃灊)鎴栬呪?鈥?涓嬫灊)錛岃嚦浜庡摢
涓負鈥?鈥濆摢涓負鈥?鈥濆垯鏃犲叧绱ц錛屾渶鍚庣殑緇撴灉浠呬粎鏄垎閰嶇殑浠g爜涓嶅悓錛岃屼唬鐮佺殑騫沖潎闀垮害鏄浉鍚岀殑銆?br />(5) 浠庢牴鑺傜偣P4寮濮嬮『鐫鏍戞灊鍒版瘡涓彾瀛愬垎鍒啓鍑烘瘡涓鍙風殑浠g爜錛屽琛?-03鎵紺恒?br />(6) 鎸夌収浠欏啘鐞嗚錛岃繖騫呭浘鍍忕殑鐔典負
H(S)=(15/39)脳log2(39/15) + (7/39)脳log2(39/7) + 鈥?+ (5/39)脳log2(39/5) = 2.1859
鍘嬬緝姣?.37:1銆?br />琛?-03 闇嶅か鏇肩紪鐮佷婦渚?br />鍥?-02 闇嶅か鏇肩紪鐮佹柟娉?br />闇嶅か鏇肩爜鐨勭爜闀胯櫧鐒舵槸鍙彉鐨勶紝浣嗗嵈涓嶉渶瑕佸彟澶栭檮鍔犲悓姝ヤ唬鐮侊紙鍓嶇紑浠g爜錛夈備緥濡傦紝鐮佷覆涓殑絎?浣嶄負0錛?br />閭f湯鑲畾鏄鍙稟錛屽洜涓鴻〃紺哄叾浠栫鍙風殑浠g爜娌℃湁涓涓槸浠?寮濮嬬殑錛屽洜姝や笅涓浣嶅氨琛ㄧず涓嬩竴涓鍙蜂唬鐮佺殑絎?
絎﹀彿 鍑虹幇鐨勬鏁?pi) log2(1/pi) 鍒嗛厤鐨勪唬鐮?闇瑕佺殑浣嶆暟
A 15(0.3846) 1.38 0 15
B 7(0.1795) 2.48 100 21
C 6(0.1538) 2.70 101 18
D 6(0.1538) 2.70 110 18
E 5(0.1282) 2.96 111 15
絎?5 欏?br />4
浣嶃傚悓鏍鳳紝濡傛灉鍑虹幇鈥?10鈥濓紝閭d箞瀹冨氨浠h〃絎﹀彿D銆傚鏋滀簨鍏堢紪鍐欏嚭涓鏈В閲婂悇縐嶄唬鐮佹剰涔夌殑鈥滆瘝鍏糕濓紝鍗崇爜
綈匡紝閭d箞灝卞彲浠ユ牴鎹爜綈夸竴涓爜涓涓爜鍦頒緷嬈¤繘琛岃瘧鐮併?br />涓庝粰鍐?鑼冭緙栫爜鐩稿悓錛岃繖涓ょ鏂規硶閮借嚜鍚悓姝ョ爜錛屽湪緙栫爜涔嬪悗鐨勭爜涓蹭腑涓嶉渶瑕佸彟澶栨坊鍔犳爣璁扮鍙鳳紙鍗沖湪
璇戠爜鏃跺垎鍓茬鍙風殑鐗規畩浠g爜錛夈?br />閲囩敤闇嶅か鏇肩紪鐮佹椂鏈変袱涓棶棰樺煎緱娉ㄦ剰錛?br />鈶犻湇澶浖鐮佹病鏈夐敊璇繚鎶ゅ姛鑳斤紝鍦ㄨ瘧鐮佹椂錛屽鏋滅爜涓蹭腑娌℃湁閿欒錛岄偅涔堝氨鑳戒竴涓帴涓涓湴姝g‘璇戝嚭浠g爜銆?br />浣嗗鏋滅爜涓蹭腑鏈夐敊璇紝鍝曚粎浠呮槸1浣嶅嚭鐜伴敊璇紝涓嶄絾榪欎釜鐮佹湰韜瘧閿欙紝鏇寸碂緋曠殑鏄竴閿欎竴澶т覆錛屽叏涔變簡濂楋紝
榪欑鐜拌薄縐頒負閿欒浼犳挱(error propagation)銆傝綆楁満瀵硅繖縐嶉敊璇篃鏃犺兘涓哄姏錛岃涓嶅嚭閿欏湪鍝噷錛屾洿璋堜笉涓婂幓
綰犳瀹冦?br />鈶¢湇澶浖鐮佹槸鍙彉闀垮害鐮侊紝鍥犳寰堥毦闅忔剰鏌ユ壘鎴栬皟鐢ㄥ帇緙╂枃浠朵腑闂寸殑鍐呭錛岀劧鍚庡啀璇戠爜錛岃繖灝遍渶瑕佸湪瀛樺偍
浠g爜涔嬪墠鍔犱互鑰冭檻銆?br />灝界濡傛錛岄湇澶浖鐮佽繕鏄緱鍒板箍娉涘簲鐢ㄣ?闇嶅か鏇肩紪鐮佹柟娉曠殑緙栫爜鏁堢巼姣斾粰鍐?鑼冭緙栫爜鏁堢巼楂樹竴浜涖?br />4.2 綆楁湳緙栫爜
綆楁湳緙栫爜鍦ㄥ浘鍍忔暟鎹帇緙╂爣鍑?濡侸PEG錛孞BIG)涓壆婕斾簡閲嶈鐨勮鑹層傚湪綆楁湳緙栫爜涓紝娑堟伅鐢?鍒?涔嬮棿鐨勫疄
鏁拌繘琛岀紪鐮侊紝綆楁湳緙栫爜鐢ㄥ埌涓や釜鍩烘湰鐨勫弬鏁幫細絎﹀彿鐨勬鐜囧拰緙栫爜闂撮殧銆備俊婧愮鍙風殑姒傜巼鍐沖畾鍘嬬緝緙栫爜鐨勬晥鐜囷紝
涔熷喅瀹氱紪鐮佽繃紼嬩腑淇℃簮絎﹀彿鐨勯棿闅旓紝鑰岃繖浜涢棿闅斿寘鍚湪0鍒?涔嬮棿銆傜紪鐮佽繃紼嬩腑鐨勯棿闅斿喅瀹氫簡絎﹀彿鍘嬬緝鍚庣殑杈?br />鍑恒傜畻鏈紪鐮佸櫒鐨勭紪鐮佽繃紼嬪彲鐢ㄤ笅闈㈢殑渚嬪瓙鍔犱互瑙i噴銆?br />[渚?.2] 鍋囪淇℃簮絎﹀彿涓簕00, 01, 10, 11}錛岃繖浜涚鍙風殑姒傜巼鍒嗗埆涓簕 0.1, 0.4, 0.2, 0.3 }錛屾牴鎹繖浜?br />姒傜巼鍙妸闂撮殧[0, 1)鍒嗘垚4涓瓙闂撮殧錛歔0, 0.1), [0.1, 0.5), [0.5, 0.7), [0.7, 1)錛屽叾涓璠x,y)琛ㄧず鍗婂紑鏀?br />闂撮殧錛屽嵆鍖呭惈x涓嶅寘鍚珁銆備笂闈㈢殑淇℃伅鍙患鍚堝湪琛?-04涓?br />琛?-04 淇℃簮絎﹀彿錛屾鐜囧拰鍒濆緙栫爜闂撮殧
濡傛灉浜岃繘鍒舵秷鎭簭鍒楃殑杈撳叆涓猴細10 00 11 00 10 11 01銆傜紪鐮佹椂棣栧厛杈撳叆鐨勭鍙鋒槸10錛屾壘鍒板畠鐨勭紪鐮佽寖鍥?br />鏄痆0.5, 0.7)銆傛秷鎭腑絎簩涓鍙?0鐨勭紪鐮佽寖鍥存槸[0, 0.1)錛屽洜姝ゅ氨鍙朳0.5, 0.7)鐨勭涓涓崄鍒嗕箣涓浣滀負鏂伴棿
闅擺0.5, 0.52)銆備緷姝ょ被鎺紝緙栫爜絎?涓鍙?1鏃跺彇鏂伴棿闅斾負[0.514, 0.52)錛岀紪鐮佺4涓鍙?0鏃訛紝鍙栨柊闂撮殧涓?br />[0.514, 0.5146)錛屸?銆傛秷鎭殑緙栫爜杈撳嚭鍙互鏄渶鍚庝竴涓棿闅斾腑鐨勪換鎰忔暟銆傛暣涓紪鐮佽繃紼嬪鍥?-03鎵紺恒?br />絎﹀彿 00 01 10 11
姒傜巼 0.1 0.4 0.2 0.3
鍒濆緙栫爜闂撮殧 [0, 0.1) [0.1, 0.5) [0.5, 0.7) [0.7, 1)
絎?6 欏?br />4
鍥?-03 綆楁湳緙栫爜榪囩▼涓句緥
榪欎釜渚嬪瓙鐨勭紪鐮佸拰璇戠爜鐨勫叏榪囩▼鍒嗗埆琛ㄧず鍦ㄨ〃4-05鍜岃〃4-06涓?br />鏍規嵁涓婇潰鎵涓劇殑渚嬪瓙錛屽彲鎶婅綆楄繃紼嬫葷粨濡備笅銆?br />鑰冭檻涓涓湁M涓鍙穒=(1,2,鈥?M)鐨勫瓧絎﹁〃闆嗭紝鍋囪姒傜巼p( i)=pi錛岃?br />銆傝緭鍏ョ鍙風敤xn琛ㄧず錛岀n涓瓙闂撮殧鐨勮寖鍥寸敤
琛ㄧず銆傚叾涓璴0=0錛宒0=1鍜宲0=0錛宭n琛ㄧず闂撮殧宸﹁竟鐣岀殑鍊?rn 琛ㄧず闂?br />闅斿彸杈圭晫鐨勫鹼紝dn=rn-ln琛ㄧず闂撮殧闀垮害銆傜紪鐮佹楠ゅ涓嬶細
姝ラ1錛氶鍏堝湪1鍜?涔嬮棿緇欐瘡涓鍙峰垎閰嶄竴涓垵濮嬪瓙闂撮殧錛屽瓙闂撮殧鐨勯暱搴︾瓑浜庡畠鐨勬鐜囷紝鍒濆瀛愰棿闅旂殑鑼?br />鍥寸敤I1=[l1錛宺1)=[ 錛?)琛ㄧず銆備護d1=r1-l1錛孡=l1鍜孯=r1銆?br />姝ラ2錛歀鍜孯鐨勪簩榪涘埗琛ㄨ揪寮忓垎鍒〃紺轟負錛?br />鍜?br />鍏朵腑ui 鍜寁i 絳変簬鈥?鈥濇垨鑰呪?鈥濄?br />鈶犲鏋渦1
鈮爒1 錛屼笉鍙戦佷換浣曟暟鎹紝杞埌姝ラ3錛?br />鈶″鏋渦1=v1錛屽氨鍙戦佷簩榪涘埗絎﹀彿u1銆?br />姣旇緝u2
鍜寁2錛氬鏋渦2鈮爒2 錛屼笉鍙戦佷換浣曟暟鎹紝杞埌姝ラ3錛?br />濡傛灉u2=v2錛屽氨鍙戦佷簩榪涘埗絎﹀彿u2銆?br />鈥?br />榪欑姣旇緝涓鐩磋繘琛屽埌涓や釜絎﹀彿涓嶇浉鍚屼負姝紝鐒跺悗榪涘叆姝ラ3銆?br />姝ラ3錛歯鍔?錛岃涓嬩竴涓鍙楓傚亣璁劇n涓緭鍏ョ鍙蜂負xn= i錛屾寜鐓т互鍓嶇殑姝ラ鎶婅繖涓棿闅斿垎鎴愬涓嬫墍紺虹殑
瀛愰棿闅旓細
絎?7 欏?br />4
浠=ln錛孯=rn 鍜?dn=rn-ln錛岀劧鍚庤漿鍒版楠?銆?br />琛?-05 緙栫爜榪囩▼
琛?-06 璇戠爜榪囩▼
[渚?.3] 鍋囪鏈?涓鍙風殑淇℃簮錛屽畠浠殑姒傜巼濡傝〃4-07鎵紺猴細
琛?-07 絎﹀彿姒傜巼
杈撳叆搴忓垪涓簒n錛?2錛?1錛?3錛屸︺傚畠鐨勭紪鐮佽繃紼嬪鍥?-04鎵紺猴紝鐜拌鏄庡涓嬨?br />杈撳叆絎?涓鍙鋒槸x1= 2錛屽彲鐭=2錛屽畾涔夊垵濮嬮棿闅旓紳[0.5, 0.75)錛岀敱姝ゅ彲鐭?br />d1=0.25錛屽乏鍙寵竟鐣岀殑浜岃繘鍒舵暟鍒嗗埆琛ㄧず涓猴細L錛?.5=0.1(B)錛孯錛?.7錛?.11鈥?(B) 銆傛寜鐓ф楠?錛寀1=v1錛屽彂
閫?銆傚洜u2鈮爒2錛屽洜姝よ漿鍒版楠?銆?br />杈撳叆絎?涓瓧絎2= 1錛宨=1錛屽畠鐨勫瓙闂撮殧錛漑0.5, 0.625)錛岀敱姝ゅ彲
寰梔2=0.125銆傚乏鍙寵竟鐣岀殑浜岃繘鍒舵暟鍒嗗埆琛ㄧず涓猴細L錛?.5=0.100 鈥?(B)錛孯錛?.101鈥?(B)銆傛寜鐓ф楠?錛?br />u2=v2=0錛屽彂閫?錛岃寀3鍜寁3涓嶇浉鍚岋紝鍥犳鍦ㄥ彂閫?涔嬪悗灝辮漿鍒版楠?銆?br />杈撳叆絎?涓瓧絎︼紝x3= 3錛宨=3錛屽畠鐨勫瓙闂撮殧錛漑0.59375, 0.609375)
錛岀敱姝ゅ彲寰梔3=0.015625銆傚乏鍙寵竟鐣岀殑浜岃繘鍒舵暟鍒嗗埆琛ㄧず涓猴細L錛?.59375=0.10011 (B)錛孯錛?br />姝ラ 杈撳叆絎﹀彿 緙栫爜闂撮殧 緙栫爜鍒ゅ喅
1 10 [0.5, 0.7) 絎﹀彿鐨勯棿闅旇寖鍥碵0.5, 0.7)
2 00 [0.5, 0.52) [0.5, 0.7)闂撮殧鐨勭涓涓?/10
3 11 [0.514, 0.52) [0.5, 0.52)闂撮殧鐨勬渶鍚庝笁涓?/10
4 00 [0.514, 0.5146) [0.514, 0.52)闂撮殧鐨勭涓涓?/10
5 10 [0.5143, 0.51442) [0.514, 0.5146)闂撮殧鐨勭浜斾釜1/10寮濮嬶紝浜屼釜1/10
6 11 [0.514384, 0.51442 [0.5143, 0.51442)闂撮殧鐨勬渶鍚?涓?/10
7 01 [0.5143836, 0.514402) [0.514384, 0.51442)闂撮殧鐨?涓?/10錛屼粠絎?涓?/10寮濮?br />8 浠嶽0.5143876, 0.514402)涓夋嫨涓涓暟浣滀負杈撳嚭錛?.5143876
姝ラ 闂撮殧 璇戠爜絎﹀彿璇戠爜鍒ゅ喅
1 [0.5, 0.7) 10 0.51439鍦ㄩ棿闅?[0.5, 0.7)
2 [0.5, 0.52) 00 0.51439鍦ㄩ棿闅?[0.5, 0.7)鐨勭1涓?/10
3 [0.514, 0.52) 11 0.51439鍦ㄩ棿闅擺0.5, 0.52)鐨勭7涓?/10
4 [0.514, 0.5146) 00 0.51439鍦ㄩ棿闅擺0.514, 0.52)鐨勭1涓?/10
5 [0.5143, 0.51442) 10 0.51439鍦ㄩ棿闅擺0.514, 0.5146)鐨勭5涓?/10
6 [0.514384, 0.51442) 11 0.51439鍦ㄩ棿闅擺0.5143, 0.51442)鐨勭7涓?/10
7 [0.51439, 0.5143948) 01 0.51439鍦ㄩ棿闅擺0.51439, 0.5143948)鐨勭1涓?/10
8 璇戠爜鐨勬秷鎭細10 00 11 00 10 11 01
淇℃簮絎﹀彿ai 1 2 3 4
姒傜巼pi p1=0.5 p2=0.25 p3=0.125 p4=0.125
鍒濆緙栫爜闂撮殧 [0, 0.5) [0.5, 0.75) [0.75, 0.875) [0.875, 1)
絎?8 欏?br />4
0.609375=0.100111 (B)銆傛寜鐓ф楠?錛寀3=v3=0錛寀4=v4=1錛寀5=v5=1錛屼絾u6鍜寁6涓嶇浉鍚岋紝鍥犳鍦ㄥ彂閫?11涔嬪悗杞埌
姝ラ3銆?br />鈥?br />鍙戦佺殑絎﹀彿鏄細10011鈥︺傝緙栫爜鐨勬渶鍚庣殑絎﹀彿鏄粨鏉熺鍙楓?br />鍥?-04 綆楁湳緙栫爜姒傚康
灝辮繖涓緥瀛愯岃█錛岀畻鏈紪鐮佸櫒鎺ュ彈鐨勭1浣嶆槸鈥?鈥濓紝瀹冪殑闂撮殧鑼冨洿灝遍檺鍒跺湪[0.5, 1)錛屼絾鍦ㄨ繖涓寖鍥撮噷鏈?br />3縐嶅彲鑳界殑鐮佺2錛?3鍜?錛屽洜姝ょ1浣嶆病鏈夊寘鍚凍澶熺殑璇戠爜淇℃伅銆傚湪鎺ュ彈絎?浣嶄箣鍚庡氨鍙樻垚鈥?0鈥濓紝瀹冭惤鍦?br />[0.5, 0.75)鐨勯棿闅旈噷錛岀敱浜庤繖涓や綅琛ㄧず鐨勭鍙烽兘鎸囧悜2寮濮嬬殑闂撮殧錛屽洜姝ゅ氨鍙柇瀹氱涓涓鍙鋒槸2銆傚湪鎺ュ彈
姣忎綅淇℃伅涔嬪悗鐨勮瘧鐮佹儏鍐靛涓嬭〃4-08鎵紺恒?br />琛?-08 璇戠爜榪囩▼琛?br />鍦ㄤ笂闈㈢殑渚嬪瓙涓紝鎴戜滑鍋囧畾緙栫爜鍣ㄥ拰璇戠爜鍣ㄩ兘鐭ラ亾娑堟伅鐨勯暱搴︼紝鍥犳璇戠爜鍣ㄧ殑璇戠爜榪囩▼涓嶄細鏃犻檺鍒跺湴榪愯
涓嬪幓銆傚疄闄呬笂鍦ㄨ瘧鐮佸櫒涓渶瑕佹坊鍔犱竴涓笓闂ㄧ殑緇堟絎︼紝褰撹瘧鐮佸櫒鐪嬪埌緇堟絎︽椂灝卞仠姝㈣瘧鐮併?br />鍦ㄧ畻鏈紪鐮佷腑闇瑕佹敞鎰忕殑鍑犱釜闂錛?br />(1) 鐢變簬瀹為檯鐨勮綆楁満鐨勭簿搴︿笉鍙兘鏃犻檺闀匡紝榪愮畻涓嚭鐜版孩鍑烘槸涓涓槑鏄劇殑闂錛屼絾澶氭暟鏈哄櫒閮芥湁16浣嶃?br />32浣嶆垨鑰?4浣嶇殑綺懼害錛屽洜姝よ繖涓棶棰樺彲浣跨敤姣斾緥緙╂斁鏂規硶瑙e喅銆?br />(2) 綆楁湳緙栫爜鍣ㄥ鏁翠釜娑堟伅鍙駭鐢熶竴涓爜瀛楋紝榪欎釜鐮佸瓧鏄湪闂撮殧[0, 1)涓殑涓涓疄鏁幫紝鍥犳璇戠爜鍣ㄥ湪鎺ュ彈
鍒拌〃紺鴻繖涓疄鏁扮殑鎵鏈変綅涔嬪墠涓嶈兘榪涜璇戠爜銆?br />(3) 綆楁湳緙栫爜涔熸槸涓縐嶅閿欒寰堟晱鎰熺殑緙栫爜鏂規硶錛屽鏋滄湁涓浣嶅彂鐢熼敊璇氨浼氬鑷存暣涓秷鎭瘧閿欍?br />綆楁湳緙栫爜鍙互鏄潤鎬佺殑鎴栬呰嚜閫傚簲鐨勩傚湪闈欐佺畻鏈紪鐮佷腑錛屼俊婧愮鍙風殑姒傜巼鏄浐瀹氱殑銆傚湪鑷傚簲綆楁湳緙栫爜
涓紝淇℃簮絎﹀彿鐨勬鐜囨牴鎹紪鐮佹椂絎﹀彿鍑虹幇鐨勯綣佺▼搴﹀姩鎬佸湴榪涜淇敼錛屽湪緙栫爜鏈熼棿浼扮畻淇℃簮絎﹀彿姒傜巼鐨勮繃紼嬪彨
鍋氬緩妯°傞渶瑕佸紑鍙戝姩鎬佺畻鏈紪鐮佺殑鍘熷洜鏄洜涓轟簨鍏堢煡閬撶簿紜殑淇℃簮姒傜巼鏄緢闅劇殑錛岃屼笖鏄笉鍒囧疄闄呯殑銆傚綋鍘嬬緝
娑堟伅鏃訛紝鎴戜滑涓嶈兘鏈熷緟涓涓畻鏈紪鐮佸櫒鑾峰緱鏈澶х殑鏁堢巼錛屾墍鑳藉仛鐨勬渶鏈夋晥鐨勬柟娉曟槸鍦ㄧ紪鐮佽繃紼嬩腑浼扮畻姒傜巼銆傚洜
姝ゅ姩鎬佸緩妯″氨鎴愪負紜畾緙栫爜鍣ㄥ帇緙╂晥鐜囩殑鍏抽敭銆?br />鎺ュ彈鐨勬暟瀛?闂撮殧 璇戠爜杈撳嚭
1 [0.5, 1) -
0 [0.5, 0.75) 2
0 [0.5, 0.609375) 1
1 [0.5625, 0.609375) -
1 [0.59375, 0.609375) 3
鈥?鈥?鈥?br />絎?9 欏?br />4
4.3 RLE緙栫爜
鍦ㄤ竴騫呭浘鍍忎腑緇忓父鍖呭惈鏈夎澶氶鑹茬浉鍚岀殑鍥懼潡銆傚湪榪欎簺鍥懼潡涓紝璁稿琛屼笂閮藉叿鏈夌浉鍚岀殑棰滆壊錛屾垨鑰呭湪涓琛?br />涓婃湁璁稿榪炵畫鐨勫儚绱犻兘鍏鋒湁鐩稿悓鐨勯鑹插箋傚湪榪欑鎯呭喌涓嬪氨涓嶉渶瑕佸瓨鍌ㄦ瘡涓涓儚绱犵殑棰滆壊鍊鹼紝鑰屼粎浠呭瓨鍌ㄤ竴涓?br />鍍忕礌鐨勯鑹插鹼紝浠ュ強鍏鋒湁鐩稿悓棰滆壊鐨勫儚绱犳暟鐩氨鍙互錛屾垨鑰呭瓨鍌ㄤ竴涓儚绱犵殑棰滆壊鍊鹼紝浠ュ強鍏鋒湁鐩稿悓棰滆壊鍊肩殑琛?br />鏁般傝繖縐嶅帇緙╃紪鐮佺О涓鴻紼嬬紪鐮?run length encoding錛孯LE)錛屽叿鏈夌浉鍚岄鑹插茍涓旀槸榪炵畫鐨勫儚绱犳暟鐩О涓鴻紼?br />闀垮害銆?br />鍋囧畾鏈変竴騫呯伆搴﹀浘鍍忥紝絎琻琛岀殑鍍忕礌鍊煎鍥?-05鎵紺猴細
鍥?-05 RLE緙栫爜鐨勬蹇?br />鐢≧LE緙栫爜鏂規硶寰楀埌鐨勪唬鐮佷負錛?0315084180銆備唬鐮佷腑鐢ㄩ粦浣撹〃紺虹殑鏁板瓧鏄紼嬮暱搴︼紝榛戜綋瀛楀悗闈㈢殑鏁板瓧浠?br />琛ㄥ儚绱犵殑棰滆壊鍊箋備緥濡傞粦浣撳瓧50浠h〃鏈夎繛緇?0涓儚绱犲叿鏈夌浉鍚岀殑棰滆壊鍊鹼紝瀹冪殑棰滆壊鍊兼槸8銆?br />瀵規瘮RLE緙栫爜鍓嶅悗鐨勪唬鐮佹暟鍙互鍙戠幇錛屽湪緙栫爜鍓嶈鐢?3涓唬鐮佽〃紺鴻繖涓琛岀殑鏁版嵁錛岃岀紪鐮佸悗鍙鐢?1涓唬
鐮佽〃紺轟唬琛ㄥ師鏉ョ殑73涓唬鐮侊紝鍘嬬緝鍓嶅悗鐨勬暟鎹噺涔嬫瘮綰︿負7:1錛屽嵆鍘嬬緝姣斾負7:1銆傝繖璇存槑RLE紜疄鏄竴縐嶅帇緙╂妧
鏈紝鑰屼笖榪欑緙栫爜鎶鏈浉褰撶洿瑙傦紝涔熼潪甯哥粡嫻庛?br />璇戠爜鏃舵寜鐓т笌緙栫爜鏃墮噰鐢ㄧ殑鐩稿悓瑙勫垯榪涜錛岃繕鍘熷悗寰楀埌鐨勬暟鎹笌鍘嬬緝鍓嶇殑鏁版嵁瀹屽叏鐩稿悓銆?br />RLE鎵鑳借幏寰楃殑鍘嬬緝姣旀湁澶氬ぇ錛岃繖涓昏鏄彇鍐充簬鍥懼儚鏈韓鐨勭壒鐐廣傚鏋滃浘鍍忎腑鍏鋒湁鐩稿悓棰滆壊鐨勫浘鍍忓潡瓚?br />澶э紝鍥懼儚鍧楁暟鐩秺灝戯紝鑾峰緱鐨勫帇緙╂瘮灝辮秺楂樸傚弽涔嬶紝鍘嬬緝姣斿氨瓚婂皬銆?br />RLE鍘嬬緝緙栫爜灝ゅ叾閫傜敤浜庤綆楁満鐢熸垚鐨勫浘鍍忥紝瀵瑰噺灝戝浘鍍忔枃浠剁殑瀛樺偍絀洪棿闈炲父鏈夋晥銆傜劧鑰岋紝RLE瀵歸鑹蹭赴瀵?br />鐨勮嚜鐒跺浘鍍忓氨鏄懼緱鍔涗笉浠庡績錛屽湪鍚屼竴琛屼笂鍏鋒湁鐩稿悓棰滆壊鐨勮繛緇儚绱犲線寰寰堝皯錛岃岃繛緇嚑琛岄兘鍏鋒湁鐩稿悓棰滆壊鍊肩殑
榪炵畫琛屾暟灝辨洿灝戙傚鏋滀粛鐒朵嬌鐢≧LE緙栫爜鏂規硶錛屼笉浠呬笉鑳藉帇緙╁浘鍍忔暟鎹紝鍙嶈屽彲鑳戒嬌鍘熸潵鐨勫浘鍍忔暟鎹彉寰楁洿
澶с傝娉ㄦ剰錛岃繖騫朵笉鏄RLE緙栫爜鏂規硶涓嶉傜敤浜庤嚜鐒跺浘鍍忕殑鍘嬬緝錛岀浉鍙嶏紝鍦ㄨ嚜鐒跺浘鍍忕殑鍘嬬緝涓繕鐪熷皯涓嶄簡RLE錛?br />鍙笉榪囨槸涓嶈兘鍗曠函浣跨敤RLE涓縐嶇紪鐮佹柟娉曪紝闇瑕佸拰鍏朵粬鐨勫帇緙╃紪鐮佹妧鏈仈鍚堝簲鐢ㄣ?br />4.4 璇嶅吀緙栫爜
鏈夎澶氬満鍚堬紝寮濮嬫椂涓嶇煡閬撹緙栫爜鏁版嵁鐨勭粺璁$壒鎬э紝涔熶笉涓瀹氬厑璁鎬綘浜嬪厛鐭ラ亾瀹冧滑鐨勭粺璁$壒鎬с傚洜姝わ紝浜?br />浠彁鍑轟簡璁歌澶氬鐨勬暟鎹帇緙╂柟娉曪紝灝藉彲鑳借幏寰楁渶澶х殑鍘嬬緝姣斻傝繖浜涙妧鏈粺縐頒負閫氱敤緙栫爜鎶鏈傝瘝鍏哥紪鐮?br />(Dictionary Encoding)鎶鏈氨灞炰簬榪欎竴綾匯?br />4.4.1 璇嶅吀緙栫爜鐨勬濇兂
璇嶅吀緙栫爜(dictionary encoding)鐨勬牴鎹槸鏁版嵁鏈韓鍖呭惈鏈夐噸澶嶄唬鐮佽繖涓壒鎬с備緥濡傛枃鏈枃浠跺拰鍏夋爡鍥懼儚
灝卞叿鏈夎繖縐嶇壒鎬с傝瘝鍏哥紪鐮佹硶鐨勭綾誨緢澶氾紝褰掔撼璧鋒潵澶ц嚧鏈変袱綾匯?br />絎竴綾昏瘝鍏哥畻娉曟槸浼佸浘鏌ユ壘姝e湪鍘嬬緝鐨勫瓧絎﹀簭鍒楁槸鍚﹀湪浠ュ墠杈撳叆鐨勬暟鎹腑鍑虹幇榪囷紝鐒跺悗杈撳嚭浠呬粎鏄寚鍚戞棭
鏈熷嚭鐜拌繃鐨勫瓧絎︿覆鐨勨滄寚閽堚濄傝繖縐嶇紪鐮佹蹇靛鍥?-06鎵紺恒?br />絎?10 欏?br />4
鍥?-06 絎竴綾昏瘝鍏告硶緙栫爜姒傚康
榪欓噷鎵鎸囩殑鈥滆瘝鍏糕濇槸鎸囩敤浠ュ墠澶勭悊榪囩殑鏁版嵁鏉ヨ〃紺虹紪鐮佽繃紼嬩腑閬囧埌鐨勯噸澶嶉儴鍒嗐傝繖綾葷紪鐮佺畻娉曢兘鏄互
Abraham Lempel鍜孞akob Ziv鍦?977騫村紑鍙戝拰鍙戣〃鐨勭О涓篖Z77綆楁硶涓哄熀紜鐨勶紝渚嬪1982騫寸敱Storer鍜孲zymanski
鏀硅繘鐨勭О涓篖ZSS綆楁硶 銆?br />絎簩綾昏瘝鍏哥畻娉曟槸浼佸浘浠庤緭鍏ョ殑鏁版嵁涓垱寤轟竴涓滅煭璇瘝鍏?dictionary of the phrases)鈥濓紝榪欑鐭
涓嶄竴瀹氭槸鍏鋒湁鍏蜂綋鍚箟鐨勭煭璇紝鍙互鏄換鎰忓瓧絎︾殑緇勫悎銆傜紪鐮佽繃紼嬩腑閬囧埌宸茬粡鍦ㄨ瘝鍏鎬腑鍑虹幇鐨勨滅煭璇濇椂錛岀紪
鐮佸櫒灝辮緭鍑鴻繖涓瘝鍏鎬腑鐨勭煭璇殑鈥滅儲寮曞彿鈥濓紝鑰屼笉鏄煭璇湰韜傝繖涓蹇靛鍥?-07鎵紺恒?br />鍥?-07 絎簩綾昏瘝鍏告硶緙栫爜姒傚康
J.Ziv鍜孉.Lempel鍦?978騫撮嬈″彂琛ㄤ簡浠嬬粛榪欑緙栫爜鏂規硶鐨勬枃绔犮傚湪浠栦滑鐨勭爺絀跺熀紜涓婏紝Terry A.Weltch
鍦?984騫村彂琛ㄤ簡鏀硅繘榪欑緙栫爜綆楁硶鐨勬枃绔狅紝鍥犳鎶婅繖縐嶇紪鐮佹柟娉曠О涓篖ZW(Lempel-Ziv Walch)鍘嬬緝緙栫爜錛屽湪楂?br />閫熺‖鐩樻帶鍒跺櫒涓?棣栧厛搴旂敤浜嗚繖縐嶇畻娉曘?br />4.4.2 LZ77綆楁硶
涓轟簡鏇村ソ鍦拌鏄嶭Z77綆楁硶鐨勫師鐞嗭紝棣栧厛浠嬬粛綆楁硶涓敤鍒扮殑鍑犱釜鏈錛?br />(1) 杈撳叆鏁版嵁嫻?input stream)錛氳琚帇緙╃殑瀛楃搴忓垪銆?br />(2) 瀛楃(character)錛氳緭鍏ユ暟鎹祦涓殑鍩烘湰鍗曞厓銆?br />(3) 緙栫爜浣嶇疆(coding position)錛氳緭鍏ユ暟鎹祦涓綋鍓嶈緙栫爜鐨勫瓧絎︿綅緗紝鎸囧墠鍚戠紦鍐插瓨鍌ㄥ櫒涓殑寮濮嬪瓧
絎︺?br />(4) 鍓嶅悜緙撳啿瀛樺偍鍣?Lookahead buffer)錛氬瓨鏀句粠緙栫爜浣嶇疆鍒拌緭鍏ユ暟鎹祦緇撴潫鐨勫瓧絎﹀簭鍒楃殑瀛樺偍鍣ㄣ?br />(5) 紿楀彛(window)錛氭寚鍖呭惈W涓瓧絎︾殑紿楀彛錛屽瓧絎︽槸浠庣紪鐮佷綅緗紑濮嬪悜鍚庢暟錛屼篃灝辨槸鏈鍚庡鐞嗙殑W涓瓧
絎?銆?婊戝姩紿楀彛)
(6) 鎸囬拡(pointer)錛氭寚鍚戠獥鍙d腑鐨勫尮閰嶄覆鐨勫紑濮嬩綅緗笖鍚暱搴︾殑鎸囬拡銆?br />LZ77緙栫爜綆楁硶鐨勬牳蹇冩槸鏌ユ壘浠庡墠鍚戠紦鍐插瓨鍌ㄥ櫒寮濮嬬殑涓庣獥鍙d腑鏈闀跨殑鍖歸厤涓層傜紪鐮佺畻娉曠殑鍏蜂綋鎵ц姝ラ濡?br />涓嬶細
絎?11 欏?br />4
(1) 鎶婄紪鐮佷綅緗緗埌杈撳叆鏁版嵁嫻佺殑寮濮嬩綅緗?br />(2) 鏌ユ壘紿楀彛涓渶闀跨殑鍖歸厤涓層?br />(3) 浠モ?Pointer, Length) Character鈥濅笁鍏冪粍鐨勬牸寮忚緭鍑猴紝鍏朵腑Pointer鏄寚鍚戠獥鍙d腑鍖歸厤涓茬殑鎸囬拡錛?br />Length琛ㄧず鍖歸厤瀛楃鐨勯暱搴︼紝Characters鏄墠鍚戠紦鍐插瓨鍌ㄥ櫒涓殑涓嶅尮閰嶇殑絎?涓瓧絎︺傛病鏈夊尮閰嶇殑瀛楃涓叉椂錛?br />杈撳嚭鈥?0, 0) Character鈥?br />(4) 濡傛灉鍓嶅悜緙撳啿瀛樺偍鍣ㄤ笉鏄┖鐨勶紝鍒欐妸緙栫爜浣嶇疆鍜岀獥鍙e悜鍓嶇Щ(Length+1)涓瓧絎︼紝鐒跺悗榪斿洖鍒版楠?銆?br />[渚?.4] 寰呯紪鐮佺殑鏁版嵁嫻佸琛?-09鎵紺猴紝緙栫爜榪囩▼濡傝〃4-10鎵紺恒傜幇浣滃涓嬭鏄庯細
(1) 鈥滄楠も濇爮琛ㄧず緙栫爜姝ラ銆?br />(2) 鈥滀綅緗濇爮琛ㄧず緙栫爜浣嶇疆錛岃緭鍏ユ暟鎹祦涓殑絎?涓瓧絎︿負緙栫爜浣嶇疆1銆?br />(3) 鈥滃尮閰嶄覆鈥濇爮琛ㄧず紿楀彛涓壘鍒扮殑鏈闀跨殑鍖歸厤涓層?br />(4) 鈥滃瓧絎︹濇爮琛ㄧず鍖歸厤涔嬪悗鍦ㄥ墠鍚戠紦鍐插瓨鍌ㄥ櫒涓殑絎?涓瓧絎︺?br />(5) 鈥滆緭鍑衡濇爮浠モ?Back_chars, Chars_length) Explicit_character鈥濇牸寮忚緭鍑恒傚叾涓紝
(Back_chars, Chars_length)鏄寚鍚戝尮閰嶄覆鐨勬寚閽堬紝鍛婅瘔璇戠爜鍣ㄢ滃湪榪欎釜紿楀彛涓悜鍚庨Back_chars涓瓧絎︾劧鍚?br />鎷瘋礉Chars_length涓瓧絎﹀埌杈撳嚭鈥濓紝Explicit_character鏄湡瀹炲瓧絎︺備緥濡傦紝琛?-10涓殑杈撳嚭鈥?5,2) C鈥濆憡
璇夎瘧鐮佸櫒鍥為5涓瓧絎︼紝鐒跺悗鎷瘋礉2涓瓧絎︹淎B鈥?br />琛?-09寰呯紪鐮佺殑鏁版嵁嫻?br />琛?-10 緙栫爜榪囩▼
4.4.3 LZSS綆楁硶
LZ77閫氳繃杈撳嚭鐪熷疄瀛楃瑙e喅浜嗗湪紿楀彛涓嚭鐜版病鏈夊尮閰嶄覆鐨勯棶棰橈紝浣嗚繖涓В鍐蟲柟妗堝寘鍚湁鍐椾綑淇℃伅銆傚啑浣欎俊
鎭〃鐜板湪涓や釜鏂歸潰錛屼竴鏄┖鎸囬拡錛屼簩鏄紪鐮佸櫒杈撳嚭鐨勫瓧絎﹀彲鑳藉寘鍚湪涓嬩竴涓尮閰嶄覆涓殑瀛楃銆?br />LZSS綆楁硶浠ユ瘮杈冩湁鏁堢殑鏂規硶瑙e喅榪欎釜闂錛屾濇兂鏄鏋滃尮閰嶄覆鐨勯暱搴︽瘮鎸囬拡鏈韓鐨勯暱搴?錛堟渶灝忓尮閰嶄覆闀?br />搴︼級闀垮氨杈撳嚭鎸囬拡錛屽惁鍒欏氨杈撳嚭鐪熷疄瀛楃銆傜敱浜庤緭鍑虹殑鍘嬬緝鏁版嵁嫻佷腑鍖呭惈鏈夋寚閽堝拰瀛楃鏈韓錛屼負浜嗗尯鍒嗗畠浠氨
闇瑕佹湁棰濆鐨勬爣蹇椾綅錛屽嵆ID浣嶃?br />LZSS緙栫爜綆楁硶鐨勫叿浣撴墽琛屾楠ゅ涓嬶細
(1) 鎶婄紪鐮佷綅緗疆浜庤緭鍏ユ暟鎹祦鐨勫紑濮嬩綅緗?br />(2) 鍦ㄥ墠鍚戠紦鍐插瓨鍌ㄥ櫒涓煡鎵句笌紿楀彛涓渶闀跨殑鍖歸厤涓?br />鈶?Pointer 錛?鍖歸厤涓叉寚閽堛?br />鈶?Length 錛?鍖歸厤涓查暱搴︺?br />(3) 鍒ゆ柇鍖歸厤涓查暱搴ength鏄惁澶т簬絳変簬鏈灝忓尮閰嶄覆闀垮害(Length鈮IN_LENGTH)錛?br />濡傛灉鈥滄槸鈥濓細杈撳嚭鎸囬拡錛岀劧鍚庢妸緙栫爜浣嶇疆鍚戝墠縐誨姩Length涓瓧絎︺?br />浣嶇疆 1 2 3 4 5 6 7 8 9
瀛楃 A A B C B B A B C
姝ラ 浣嶇疆 鍖歸厤涓?瀛楃 杈撳嚭
1 1 -- A (0,0) A
2 2 A B (1,1) B
3 4 -- C (0,0) C
4 5 B B (2,1) B
5 7 A B C (5,2) C
絎?12 欏?br />4
濡傛灉鈥滃惁鈥濓細杈撳嚭鍓嶅悜緙撳啿瀛樺偍鍣ㄤ腑鐨勭1涓瓧絎︼紝鐒跺悗鎶婄紪鐮佷綅緗悜鍓嶇Щ鍔ㄤ竴涓瓧絎︺?br />(4) 濡傛灉鍓嶅悜緙撳啿瀛樺偍鍣ㄤ笉鏄┖鐨勶紝灝辮繑鍥炲埌姝ラ2銆?br />[渚?.5] 緙栫爜瀛楃涓插琛?-11鎵紺猴紝緙栫爜榪囩▼濡傝〃4-12鎵紺恒傜幇璇存槑濡備笅錛?br />(1) 鈥滄楠も濇爮琛ㄧず緙栫爜姝ラ銆?br />(2) 鈥滀綅緗濇爮琛ㄧず緙栫爜浣嶇疆錛岃緭鍏ユ暟鎹祦涓殑絎?涓瓧絎︿負緙栫爜浣嶇疆1銆?br />(3) 鈥滃尮閰嶁濇爮琛ㄧず紿楀彛涓壘鍒扮殑鏈闀跨殑鍖歸厤涓層?br />(4) 鈥滃瓧絎︹濇爮琛ㄧず鍖歸厤涔嬪悗鍦ㄥ墠鍚戠紦鍐插瓨鍌ㄥ櫒涓殑絎?涓瓧絎︺?br />(5) 鈥滆緭鍑衡濇爮鐨勮緭鍑轟負錛?br />鈶?濡傛灉鍖歸厤涓叉湰韜殑闀垮害Length鈮IN_LENGTH錛岃緭鍑烘寚鍚戝尮閰嶄覆鐨勬寚閽堬紝鏍煎紡涓?Back_chars,
Chars_length)銆傝鎸囬拡鍛婅瘔璇戠爜鍣ㄢ滃湪榪欎釜紿楀彛涓悜鍚庨Back_chars涓瓧絎︾劧鍚庢嫹璐滳hars_length涓瓧絎﹀埌
杈撳嚭鈥濄?br />鈶?濡傛灉鍖歸厤涓叉湰韜殑闀垮害Length鈮IN_LENGTH錛屽垯杈撳嚭鐪熷疄鐨勫尮閰嶄覆銆?br />琛?-11 杈撳叆鏁版嵁嫻?br />琛?-12 緙栫爜榪囩▼(MIN_LENGTH = 2)
鍦ㄧ浉鍚岀殑璁$畻鐜涓嬶紝LZSS綆楁硶姣擫Z77鍙幏寰楁瘮杈冮珮鐨勫帇緙╂瘮錛岃岃瘧鐮佸悓鏍風畝鍗曘傝繖涔熷氨鏄負浠涔堣繖縐嶇畻
娉曟垚涓哄紑鍙戞柊綆楁硶鐨勫熀紜錛岃澶氬悗鏉ュ紑鍙戠殑鏂囨。鍘嬬緝紼嬪簭閮戒嬌鐢ㄤ簡LZSS鐨勬濇兂銆備緥濡傦紝PKZip, ARJ, LHArc鍜?br />ZOO絳夌瓑錛屽叾宸埆浠呬粎鏄寚閽堢殑闀跨煭鍜岀獥鍙g殑澶у皬絳夋湁鎵涓嶅悓銆?br />LZSS鍚屾牱鍙互鍜岀喌緙栫爜鑱斿悎浣跨敤錛屼緥濡侫RJ灝變笌闇嶅か鏇肩紪鐮佽仈鐢紝鑰孭KZip鍒欎笌Shannon-Fano鑱旂敤錛屽畠鐨勫悗
緇増鏈篃閲囩敤闇嶅か鏇肩紪鐮併?br />4.4.4 LZ78綆楁硶
鍦ㄤ粙緇峀Z78綆楁硶涔嬪墠錛岄鍏堣鏄庡湪綆楁硶涓敤鍒扮殑鍑犱釜鏈鍜岀鍙鳳細
(1) 瀛楃嫻?Charstream)錛氳琚紪鐮佺殑鏁版嵁搴忓垪銆?br />(2) 瀛楃(Character)錛氬瓧絎︽祦涓殑鍩烘湰鏁版嵁鍗曞厓銆?br />(3) 鍓嶇紑(Prefix)錛?鍦ㄤ竴涓瓧絎︿箣鍓嶇殑瀛楃搴忓垪銆?br />(4) 緙-絎︿覆(String)錛氬墠緙錛嬪瓧絎︺?br />(5) 鐮佸瓧(Code word)錛氱爜瀛楁祦涓殑鍩烘湰鏁版嵁鍗曞厓錛屼唬琛ㄨ瘝鍏鎬腑鐨勪竴涓插瓧絎︺?br />(6) 鐮佸瓧嫻?Codestream)錛?鐮佸瓧鍜屽瓧絎︾粍鎴愮殑搴忓垪錛屾槸緙栫爜鍣ㄧ殑杈撳嚭銆?br />(7) 璇嶅吀(Dictionary)錛?緙-絎︿覆琛ㄣ傛寜鐓ц瘝鍏鎬腑鐨勭儲寮曞彿瀵規瘡鏉$紑-絎︿覆(String)鎸囧畾涓涓爜瀛?Code
浣嶇疆 1 2 3 4 5 6 7 8 9 10 11
瀛楃 A A B B C B B A A B C
姝ラ 浣嶇疆 鍖歸厤涓?杈撳嚭
1 1 -- A
2 2 A A
3 3 -- B
4 4 B B
5 5 -- C
6 6 B B (3,2)
7 8 A A B (7,3)
8 11 C C
絎?13 欏?br />4
word)銆?br />(8) 褰撳墠鍓嶇紑(Current prefix)錛氬湪緙栫爜綆楁硶涓嬌鐢紝鎸囧綋鍓嶆鍦ㄥ鐞嗙殑鍓嶇紑錛岀敤絎﹀彿P琛ㄧず銆?br />(9) 褰撳墠瀛楃(Current character)錛氬湪緙栫爜綆楁硶涓嬌鐢紝鎸囧綋鍓嶅墠緙涔嬪悗鐨勫瓧絎︼紝鐢ㄧ鍙稢琛ㄧず銆?br />(10) 褰撳墠鐮佸瓧(Current code word)錛?鍦ㄨ瘧鐮佺畻娉曚腑浣跨敤錛屾寚褰撳墠澶勭悊鐨勭爜瀛楋紝鐢╓琛ㄧず褰撳墠鐮佸瓧錛?br />String.W琛ㄧず褰撳墠鐮佸瓧鐨勭紑-絎︿覆銆?br />1. 緙栫爜綆楁硶
LZ78鐨勭紪鐮佹濇兂鏄笉鏂湴浠庡瓧絎︽祦涓彁鍙栨柊鐨勭紑-絎︿覆(String)錛岄氫織鍦扮悊瑙d負鏂扳滆瘝鏉♀濓紝鐒跺悗鐢ㄢ滀唬
鍙封濅篃灝辨槸鐮佸瓧(Code word)琛ㄧず榪欎釜鈥滆瘝鏉♀濄傝繖鏍蜂竴鏉ワ紝瀵瑰瓧絎︽祦鐨勭紪鐮佸氨鍙樻垚浜嗙敤鐮佸瓧(Code word)鍘繪浛
鎹㈠瓧絎︽祦(Charstream)錛岀敓鎴愮爜瀛楁祦(Codestream)錛屼粠鑰岃揪鍒板帇緙╂暟鎹殑鐩殑銆?br />鍦ㄧ紪鐮佸紑濮嬫椂璇嶅吀鏄┖鐨勶紝涓嶅寘鍚換浣曠紑-絎︿覆(string)銆傚湪榪欑鎯呭喌涓嬬紪鐮佸櫒灝辮緭鍑轟竴涓〃紺虹┖瀛楃涓?br />鐨勭壒孌婄爜瀛?渚嬪鈥?鈥?鍜屽瓧絎︽祦涓?Charstream)鐨勭涓涓瓧絎錛屽茍鎶婅繖涓瓧絎娣誨姞鍒拌瘝鍏鎬腑浣滀負涓涓敱涓
涓瓧絎︾粍鎴愮殑緙-絎︿覆(string)銆傚湪緙栫爜榪囩▼涓紝濡傛灉鍑虹幇綾諱技鐨勬儏鍐碉紝涔熺収姝ゅ姙鐞嗐?br />鍦ㄨ瘝鍏鎬腑宸茬粡鍖呭惈鏌愪簺緙-絎︿覆(String)涔嬪悗錛屽鏋溾滃綋鍓嶅墠緙P +褰撳墠瀛楃C鈥濆凡緇忓湪璇嶅吀涓紝灝辯敤瀛楃C
鏉ユ墿灞曡繖涓墠緙錛岃繖鏍風殑鎵╁睍鎿嶄綔涓鐩撮噸澶嶅埌鑾峰緱涓涓湪璇嶅吀涓病鏈夌殑緙-絎︿覆(String)涓烘銆傛鏃跺氨杈撳嚭琛?br />紺哄綋鍓嶅墠緙P鐨勭爜瀛?Code word)鍜屽瓧絎錛屽茍鎶奝+C娣誨姞鍒拌瘝鍏鎬腑錛岀劧鍚庡紑濮嬪鐞嗗瓧絎︽祦(Charstream)涓殑涓嬩竴
涓墠緙銆?br />LZ78緙栫爜鍣ㄧ殑杈撳嚭鏄爜瀛?瀛楃(W,C)瀵癸紝姣忔杈撳嚭涓瀵瑰埌鐮佸瓧嫻佷腑錛屽茍鐢ㄥ瓧絎鎵╁睍涓庣爜瀛梂鐩稿搴旂殑緙-
絎︿覆(String)錛岀敓鎴愭柊鐨勭紑-絎︿覆(String)錛岀劧鍚庢坊鍔犲埌璇嶅吀涓?br />LZ78緙栫爜鐨勫叿浣撶畻娉曞涓嬶細
姝ラ1錛?鍦ㄥ紑濮嬫椂錛岃瘝鍏稿拰褰撳墠鍓嶇紑P閮芥槸絀虹殑銆?br />姝ラ2錛?褰撳墠瀛楃C 錛? 瀛楃嫻佷腑鐨勪笅涓涓瓧絎︺?br />姝ラ3錛?鍒ゆ柇P+C鏄惁鍦ㄨ瘝鍏鎬腑錛?br />(1) 濡傛灉鈥滄槸鈥濓細鐢–鎵╁睍P錛岃P 錛? P+C 錛?br />(2) 濡傛灉鈥滃惁鈥濓細
鈶?杈撳嚭涓庡綋鍓嶅墠緙P鐩稿搴旂殑鐮佸瓧鍜屽綋鍓嶅瓧絎錛?br />鈶?鎶婂瓧絎︿覆P+C 娣誨姞鍒拌瘝鍏鎬腑銆?br />鈶?浠 錛? 絀哄箋?br />(3) 鍒ゆ柇瀛楃嫻佷腑鏄惁榪樻湁瀛楃闇瑕佺紪鐮?br />鈶?濡傛灉鈥滄槸鈥濓細榪斿洖鍒版楠?銆?br />鈶?濡傛灉鈥滃惁鈥濓細鑻ュ綋鍓嶅墠緙P涓嶆槸絀虹殑錛岃緭鍑虹浉搴斾簬褰撳墠鍓嶇紑P鐨勭爜瀛楋紝鐒跺悗緇撴潫緙栫爜銆?br />2. 璇戠爜綆楁硶
鍦ㄨ瘧鐮佸紑濮嬫椂璇戠爜璇嶅吀鏄┖鐨勶紝瀹冨皢鍦ㄨ瘧鐮佽繃紼嬩腑浠庣爜瀛楁祦涓噸鏋勩傛瘡褰撲粠鐮佸瓧嫻佷腑璇誨叆涓瀵圭爜瀛?瀛楃
(W,C)瀵規椂錛岀爜瀛楀氨鍙傝冨凡緇忓湪璇嶅吀涓殑緙-絎︿覆錛岀劧鍚庢妸褰撳墠鐮佸瓧鐨勭紑-絎︿覆string.W 鍜屽瓧絎杈撳嚭鍒板瓧絎︽祦
(Charstream)錛岃屾妸褰撳墠緙-絎︿覆(string.W+C)娣誨姞鍒拌瘝鍏鎬腑銆傚湪璇戠爜緇撴潫涔嬪悗錛岄噸鏋勭殑璇嶅吀涓庣紪鐮佹椂鐢熸垚鐨?br />璇嶅吀瀹屽叏鐩稿悓銆?br />LZ78璇戠爜鐨勫叿浣撶畻娉曞涓嬶細
姝ラ1錛?鍦ㄥ紑濮嬫椂璇嶅吀鏄┖鐨勩?br />姝ラ2錛?褰撳墠鐮佸瓧W 錛? 鐮佸瓧嫻佷腑鐨勪笅涓涓爜瀛椼?br />姝ラ3錛?褰撳墠瀛楃C 錛? 绱ч殢鐮佸瓧涔嬪悗鐨勫瓧絎︺?br />姝ラ4錛?鎶婂綋鍓嶇爜瀛楃殑緙-絎︿覆(string.W)杈撳嚭鍒板瓧絎︽祦(Charstream)錛岀劧鍚庤緭鍑哄瓧絎銆?br />姝ラ5錛?鎶妔tring.W+C娣誨姞鍒拌瘝鍏鎬腑銆?br />姝ラ6錛?鍒ゆ柇鐮佸瓧嫻佷腑鏄惁榪樻湁鐮佸瓧瑕佽瘧
絎?14 欏?br />4
(1) 濡傛灉鈥滄槸鈥濓紝灝辮繑鍥炲埌姝ラ2銆?br />(2) 濡傛灉鈥滃惁鈥濓紝鍒欑粨鏉熴?br />[渚?.6] 緙栫爜瀛楃涓插琛?-13鎵紺猴紝緙栫爜榪囩▼濡傝〃4-14鎵紺恒傜幇璇存槑濡備笅錛?br />(1) 鈥滄楠も濇爮琛ㄧず緙栫爜姝ラ銆?br />(2) 鈥滀綅緗濇爮琛ㄧず鍦ㄨ緭鍏ユ暟鎹腑鐨勫綋鍓嶄綅緗?br />(3) 鈥滆瘝鍏糕濇爮琛ㄧず娣誨姞鍒拌瘝鍏鎬腑鐨勭紑-絎︿覆錛岀紑-絎︿覆鐨勭儲寮曠瓑浜庘滄楠も濆簭鍙楓?br />(4) 鈥滆緭鍑衡濇爮浠?褰撳墠鐮佸瓧W, 褰撳墠瀛楃C)綆鍖栦負(W, C)鐨勫艦寮忚緭鍑恒?br />琛?-13 緙栫爜瀛楃涓?br />琛?-14 緙栫爜榪囩▼
涓嶭Z77鐩告瘮錛孡Z78鐨勬渶澶т紭鐐規槸鍦ㄦ瘡涓紪鐮佹楠や腑鍑忓皯浜嗙紑-絎︿覆(String)姣旇緝鐨勬暟鐩紝鑰屽帇緙╃巼涓嶭Z77
綾諱技銆?br />4.4.5 LZW綆楁硶
鍦↙ZW綆楁硶涓嬌鐢ㄧ殑鏈涓嶭Z78浣跨敤鐨勭浉鍚岋紝浠呭鍔犱簡涓涓湳璇斿墠緙鏍?Root)錛屽畠鏄敱鍗曚釜瀛楃緇勬垚鐨?br />緙-絎︿覆(String)銆傚湪緙栫爜鍘熺悊涓婏紝LZW涓嶭Z78鐩告瘮鏈夊涓嬪樊鍒細
鈶?LZW鍙緭鍑轟唬琛ㄨ瘝鍏鎬腑鐨勭紑-絎︿覆(String)鐨勭爜瀛?code word)銆傝繖灝辨剰鍛沖湪寮濮嬫椂璇嶅吀涓嶈兘鏄┖鐨勶紝瀹?br />蹇呴』鍖呭惈鍙兘鍦ㄥ瓧絎︽祦鍑虹幇涓殑鎵鏈夊崟涓瓧絎︼紝鍗沖墠緙鏍?Root)銆?br />鈶?鐢變簬鎵鏈夊彲鑳藉嚭鐜扮殑鍗曚釜瀛楃閮戒簨鍏堝寘鍚湪璇嶅吀涓紝姣忔緙栫爜寮濮嬫椂閮戒嬌鐢ㄤ竴涓瓧絎﹀墠緙(onecharacter
prefix)錛屽洜姝ゅ湪璇嶅吀涓鍔犵殑絎?涓紑-絎︿覆鏈変袱涓瓧絎︺?br />鐜板皢LZW緙栫爜綆楁硶鍜岃瘧鐮佺畻娉曚粙緇嶅涓嬨?br />1. 緙栫爜綆楁硶
LZW緙栫爜鏄洿緇曠О涓鴻瘝鍏哥殑杞崲琛ㄦ潵瀹屾垚鐨勩傝繖寮犺漿鎹㈣〃瀛樻斁縐頒負鍓嶇紑(Prefix)鐨勫瓧絎﹀簭鍒楋紝騫朵負姣忎釜琛?br />欏瑰垎閰嶄竴涓爜瀛?Code word)錛屾垨鑰呭彨鍋氬簭鍙鳳紝濡傝〃4-15鎵紺恒傝繖寮犺漿鎹㈣〃瀹為檯涓婃槸鎶?浣岮SCII瀛楃闆嗚繘琛屾墿
鍏咃紝澧炲姞鐨勭鍙風敤鏉ヨ〃紺哄湪鏂囨湰鎴栧浘鍍忎腑鍑虹幇鐨勫彲鍙橀暱搴SCII瀛楃涓層傛墿鍏呭悗鐨勪唬鐮佸彲鐢?浣嶃?0浣嶃?1浣嶃?br />12浣嶇敋鑷蟲洿澶氱殑浣嶆潵琛ㄧず銆俉elch鐨勮鏂囦腑鐢ㄤ簡12浣嶏紝12浣嶅彲浠ユ湁4096涓笉鍚岀殑12浣嶄唬鐮侊紝榪欏氨鏄錛岃漿鎹㈣〃
鏈?096涓〃欏癸紝鍏朵腑256涓〃欏圭敤鏉ュ瓨鏀懼凡瀹氫箟鐨勫瓧絎︼紝鍓╀笅3840涓〃欏圭敤鏉ュ瓨鏀懼墠緙(Prefix)銆?br />琛?-15 璇嶅吀
浣嶇疆 1 2 3 4 5 6 7 8 9
瀛楃 A B B C B C A B A
姝ラ 浣嶇疆 璇嶅吀 杈撳嚭
1 1 A (0,A)
2 2 B (0,B)
3 3 B C (2,C)
4 5 B C A (3,A)
5 8 B A (2,A)
鐮佸瓧(Code word) 鍓嶇紑(Prefix)
1
絎?15 欏?br />4
LZW緙栫爜鍣?杞歡緙栫爜鍣ㄦ垨紜歡緙栫爜鍣?灝辨槸閫氳繃綆$悊榪欎釜璇嶅吀瀹屾垚杈撳叆涓庤緭鍑轟箣闂寸殑杞崲銆侺ZW緙栫爜鍣ㄧ殑杈?br />鍏ユ槸瀛楃嫻?Charstream)錛屽瓧絎︽祦鍙互鏄敤8浣岮SCII瀛楃緇勬垚鐨勫瓧絎︿覆錛岃岃緭鍑烘槸鐢╪浣?渚嬪12浣?琛ㄧず鐨勭爜
瀛楁祦(Codestream)錛岀爜瀛椾唬琛ㄥ崟涓瓧絎︽垨澶氫釜瀛楃緇勬垚鐨勫瓧絎︿覆銆?br />LZW緙栫爜鍣ㄤ嬌鐢ㄤ簡涓縐嶅緢瀹炵敤鐨勫垎鏋?parsing)綆楁硶錛岀О涓鴻椽濠垎鏋愮畻娉?greedy parsing algorithm)銆傚湪
璐┆鍒嗘瀽綆楁硶涓紝姣忎竴嬈″垎鏋愰兘瑕佷覆琛屽湴媯鏌ユ潵鑷瓧絎︽祦(Charstream)鐨勫瓧絎︿覆錛屼粠涓垎瑙e嚭宸茬粡璇嗗埆鐨勬渶闀?br />鐨勫瓧絎︿覆錛屼篃灝辨槸宸茬粡鍦ㄨ瘝鍏鎬腑鍑虹幇鐨勬渶闀跨殑鍓嶇紑(Prefix)銆傜敤宸茬煡鐨勫墠緙(Prefix)鍔犱笂涓嬩竴涓緭鍏ュ瓧絎涔?br />灝辨槸褰撳墠瀛楃(Current character)浣滀負璇ュ墠緙鐨勬墿灞曞瓧絎︼紝褰㈡垚鏂扮殑鎵╁睍瀛楃涓測斺旂紑-絎︿覆(String)錛?br />Prefix+C銆傝繖涓柊鐨勭紑-絎︿覆(String)鏄惁瑕佸姞鍒拌瘝鍏鎬腑錛岃繕瑕佺湅璇嶅吀涓槸鍚﹀瓨鏈夊拰瀹冪浉鍚岀殑緙-絎︿覆String銆?br />濡傛灉鏈夛紝閭d箞榪欎釜緙-絎︿覆(String)灝卞彉鎴愬墠緙(Prefix)錛岀戶緇緭鍏ユ柊鐨勫瓧絎︼紝鍚﹀垯灝辨妸榪欎釜緙-絎︿覆(String)
鍐欏埌璇嶅吀涓敓鎴愪竴涓柊鐨勫墠緙(Prefix)錛屽茍鍒嗛厤緇欎竴涓唬鐮併?br />LZW緙栫爜綆楁硶鐨勫叿浣撴墽琛屾楠ゅ涓嬶細
姝ラ1錛?寮濮嬫椂鐨勮瘝鍏稿寘鍚墍鏈夊彲鑳界殑鏍?Root)錛岃屽綋鍓嶅墠緙P鏄┖鐨勶紱
姝ラ2錛?褰撳墠瀛楃(C) 錛?瀛楃嫻佷腑鐨勪笅涓涓瓧絎︼紱
姝ラ3錛?鍒ゆ柇緙-絎︿覆P+C鏄惁鍦ㄨ瘝鍏鎬腑
(1) 濡傛灉鈥滄槸鈥濓細P 錛? P+C // (鐢–鎵╁睍P) 錛?br />(2) 濡傛灉鈥滃惁鈥?br />鈶?鎶婁唬琛ㄥ綋鍓嶅墠緙P鐨勭爜瀛楄緭鍑哄埌鐮佸瓧嫻?
鈶?鎶婄紑-絎︿覆P+C娣誨姞鍒拌瘝鍏?
鈶?浠 錛? C //(鐜板湪鐨凱浠呭寘鍚竴涓瓧絎);
姝ラ4錛?鍒ゆ柇鐮佸瓧嫻佷腑鏄惁榪樻湁鐮佸瓧瑕佽瘧
(1) 濡傛灉鈥滄槸鈥濓紝灝辮繑鍥炲埌姝ラ2錛?br />(2) 濡傛灉鈥滃惁鈥?br />鈶?鎶婁唬琛ㄥ綋鍓嶅墠緙P鐨勭爜瀛楄緭鍑哄埌鐮佸瓧嫻?
鈶?緇撴潫銆?br />LZW緙栫爜綆楁硶鍙敤浼爜琛ㄧず銆傚紑濮嬫椂鍋囪緙栫爜璇嶅吀鍖呭惈鑻ュ共涓凡緇忓畾涔夌殑鍗曚釜鐮佸瓧銆備緥濡傦紝256涓瓧絎︾殑鐮?br />瀛楋紝鐢ㄤ吉鐮佸彲浠ヨ〃紺烘垚錛?br />鈥?鈥?br />193 A
194 B
鈥?鈥?br />255
鈥?鈥?br />1305 abcdefxyF01234
鈥?鈥?br />Dictionary[j] 鈫?all n single-character錛?j錛?, 2錛?鈥︼紝n
j 鈫?n+1
Prefix 鈫?read first Character in Charstream
while((C 鈫?next Character)!=NULL)
絎?16 欏?br />4
2. 璇戠爜綆楁硶
LZW璇戠爜綆楁硶涓繕鐢ㄥ埌鍙﹀涓や釜鏈錛?br />鈶?褰撳墠鐮佸瓧(Current code word)錛氭寚褰撳墠姝e湪澶勭悊鐨勭爜瀛楋紝鐢╟W琛ㄧず錛岀敤string.cW琛ㄧず褰撳墠緙-絎︿覆錛?br />鈶?鍏堝墠鐮佸瓧(Previous code word)錛氭寚鍏堜簬褰撳墠鐮佸瓧鐨勭爜瀛楋紝鐢╬W琛ㄧず錛岀敤string.pW琛ㄧず鍏堝墠緙-絎?br />涓層?br />LZW璇戠爜綆楁硶寮濮嬫椂錛岃瘧鐮佽瘝鍏鎬笌緙栫爜璇嶅吀鐩稿悓錛屽畠鍖呭惈鎵鏈夊彲鑳界殑鍓嶇紑鏍?roots)銆侺ZW綆楁硶鍦ㄨ瘧鐮佽繃紼?br />涓細璁頒綇鍏堝墠鐮佸瓧(pW)錛屼粠鐮佸瓧嫻佷腑璇誨綋鍓嶇爜瀛?cW)涔嬪悗杈撳嚭褰撳墠緙-絎︿覆string.cW錛岀劧鍚庢妸鐢╯tring.cW鐨?br />絎竴涓瓧絎︽墿灞曠殑鍏堝墠緙-絎︿覆string.pW娣誨姞鍒拌瘝鍏鎬腑銆?br />LZW璇戠爜綆楁硶鐨勫叿浣撴墽琛屾楠ゅ涓嬶細
姝ラ1錛?鍦ㄥ紑濮嬭瘧鐮佹椂璇嶅吀鍖呭惈鎵鏈夊彲鑳界殑鍓嶇紑鏍?Root)銆?br />姝ラ2錛?cW 錛? 鐮佸瓧嫻佷腑鐨勭涓涓爜瀛椼?br />姝ラ3錛?杈撳嚭褰撳墠緙-絎︿覆string.cW鍒扮爜瀛楁祦銆?br />姝ラ4錛?鍏堝墠鐮佸瓧pW 錛? 褰撳墠鐮佸瓧cW銆?br />姝ラ5錛?褰撳墠鐮佸瓧cW 錛? 鐮佸瓧嫻佷腑鐨勪笅涓涓爜瀛椼?br />姝ラ6錛?鍒ゆ柇褰撳墠緙-絎︿覆string.cW鏄惁鍦ㄨ瘝鍏鎬腑
(1) 濡傛灉鈥滄槸鈥濓紝鍒欙細
鈶?鎶婂綋鍓嶇紑-絎︿覆string.cW杈撳嚭鍒板瓧絎︽祦銆?br />鈶?鎶婂厛鍓嶇紑-絎︿覆string.pW + 褰撳墠鍓嶇紑-絎︿覆string.cW鐨勭涓涓瓧絎娣誨姞鍒拌瘝鍏搞?br />(2) 濡傛灉鈥滃惁鈥濓紝鍒欙細
鈶?杈撳嚭鍏堝墠緙-絎︿覆string.pW + 鍏堝墠緙-絎︿覆string.pW鐨勭涓涓瓧絎﹀埌瀛楃嫻侊紝
鈶?鎶婂畠娣誨姞鍒拌瘝鍏鎬腑銆?br />姝ラ7錛?鍒ゆ柇鐮佸瓧嫻佷腑鏄惁榪樻湁鐮佸瓧瑕佽瘧
(1) 濡傛灉鈥滄槸鈥濓紝灝辮繑鍥炲埌姝ラ4銆?br />(2) 濡傛灉鈥滃惁鈥? 緇撴潫銆?br />LZW璇戠爜綆楁硶鍙敤浼爜琛ㄧず濡備笅錛?br />Codestream 鈫?cW for Prefix
Dictionary[j] 鈫?all n single-character錛?j錛?, 2錛?鈥︼紝n
j 鈫?n+1
cW 鈫?first code from Codestream
Charstream 鈫?Dictionary[cW]
pW 鈫?cW
While((cW 鈫?next Code word)!=NULL)
絎?17 欏?br />4
[渚?.7] 緙栫爜瀛楃涓插琛?-16鎵紺猴紝緙栫爜榪囩▼濡傝〃4-17鎵紺恒傜幇璇存槑濡備笅錛?br />(1) 鈥滄楠も濇爮琛ㄧず緙栫爜姝ラ錛?br />(2) 鈥滀綅緗濇爮琛ㄧず鍦ㄨ緭鍏ユ暟鎹腑鐨勫綋鍓嶄綅緗紱
(3) 鈥滆瘝鍏糕濇爮琛ㄧず娣誨姞鍒拌瘝鍏鎬腑鐨勭紑-絎︿覆錛屽畠鐨勭儲寮曞湪鎷彿涓紱
(4) 鈥滆緭鍑衡濇爮琛ㄧず鐮佸瓧杈撳嚭銆?br />琛?-16 琚紪鐮佺殑瀛楃涓?br />琛?-17 LZW鐨勭紪鐮佽繃紼?br />琛?-18瑙i噴浜嗚瘧鐮佽繃紼嬨傛瘡涓瘧鐮佹楠よ瘧鐮佸櫒璇諱竴涓爜瀛楋紝杈撳嚭鐩稿簲鐨勭紑-絎︿覆錛屽茍鎶婂畠娣誨姞鍒拌瘝鍏鎬腑銆?br />渚嬪錛屽湪姝ラ4涓紝鍏堝墠鐮佸瓧(2)瀛樺偍鍦ㄥ厛鍓嶇爜瀛?pW)涓紝褰撳墠鐮佸瓧(cW)鏄?4)錛屽綋鍓嶇紑-絎︿覆string.cW鏄緭鍑?br />(鈥淎 B鈥?錛屽厛鍓嶇紑-絎︿覆string.pW ("B")鏄敤褰撳墠緙-絎︿覆string.cW ("A")鐨勭涓涓瓧絎︼紝鍏剁粨鏋?"B A")
娣誨姞鍒拌瘝鍏鎬腑錛屽畠鐨勭儲寮曞彿鏄?6)
琛?-18 LZW鐨勮瘧鐮佽繃紼?br />LZW綆楁硶寰楀埌鏅亶閲囩敤錛屽畠鐨勯熷害姣斾嬌鐢↙Z77綆楁硶鐨勯熷害蹇紝鍥犱負瀹冧笉闇瑕佹墽琛岄偅涔堝鐨勭紑-絎︿覆姣旇緝鎿?br />浣嶇疆 1 2 3 4 5 6 7 8 9
瀛楃 A B B A B A B A C
姝ラ 浣嶇疆 璇嶅吀 杈撳嚭
(1) A
(2) B
(3) C
1 1 (4) A B (1)
2 2 (5) B B (2)
3 3 (6) B A (2)
4 4 (7) A B A (4)
5 6 (8) A B A C (7)
6 -- -- -- (3)
姝ラ 浠g爜 璇嶅吀 杈撳嚭
(1) A
(2) B
(3) C
1 (1) -- -- A
2 (2) (4) A B B
3 (2) (5) B B B
4 (4) (6) B A A B
5 (7) (7) A B A A B A
6 (3) (8) A B A C C
絎?18 欏?br />4
浣溿傚LZW綆楁硶榪涗竴姝ョ殑鏀硅繘鏄鍔犲彲鍙樼殑鐮佸瓧闀垮害錛屼互鍙婂湪璇嶅吀涓垹闄よ佺殑緙-絎︿覆銆傚湪GIF鍥懼儚鏍煎紡鍜孶NIX
鐨勫帇緙╃▼搴忎腑宸茬粡閲囩敤浜嗚繖浜涙敼榪涙帾鏂戒箣鍚庣殑LZW綆楁硶銆?br />LZW綆楁硶鍙栧緱浜嗕笓鍒╋紝涓撳埄鏉冪殑鎵鏈夎呮槸緹庡浗鐨勪竴涓ぇ鍨嬭綆楁満鍏徃鈥擴nisys(浼樺埄緋葷粺鍏徃)錛岄櫎浜嗗晢涓?br />杞歡鐢熶駭鍏徃涔嬪錛屽彲浠ュ厤璐逛嬌鐢↙ZW綆楁硶銆?/font>

swo 2006-08-21 14:20 鍙戣〃璇勮
]]>
gziphttp://m.shnenglu.com/swo2006/articles/11515.htmlswoswoMon, 21 Aug 2006 03:18:00 GMThttp://m.shnenglu.com/swo2006/articles/11515.htmlhttp://m.shnenglu.com/swo2006/comments/11515.htmlhttp://m.shnenglu.com/swo2006/articles/11515.html#Feedback0http://m.shnenglu.com/swo2006/comments/commentRss/11515.htmlhttp://m.shnenglu.com/swo2006/services/trackbacks/11515.html 錛堟敞錛氫互涓嬪叧浜庢妧鏈粏鑺傜殑鎻忚堪鏄互 gzip 鐨勫叕寮婧愪唬鐮佷負鍩虹鐨勶紝濡傛灉闇瑕佸畬鏁寸殑浠g爜錛屽彲浠ュ湪 gzip 鐨勫畼鏂圭綉绔?www.gzip.org涓嬭澆銆備笅闈㈡彁鍒扮殑姣忎竴涓棶棰橈紝閮介鍏堜粙緇嶆渶鐩磋綆鍗曠殑瑙e喅鏂規硶錛岀劧鍚庢寚鍑鴻繖縐嶆柟娉曠殑寮婄鎵鍦紝鏈鍚庝粙緇?span lang="EN-US"> gzip 閲囩敤鐨勫仛娉曪紝榪欐牱涔熻鑳戒嬌璇昏呭 gzip 鐪嬩技澶嶆潅銆佷笉鐩磋鐨勫仛娉曠殑鎰忎箟鏈夋洿濂界殑鐞嗚В銆傦級
鏈 鐩磋鐨勬悳绱㈡柟寮忔槸欏哄簭鎼滅儲錛氫互寰呭帇緙╅儴鍒嗙殑絎竴涓瓧鑺備笌紿楀彛涓殑姣忎竴涓瓧鑺備緷嬈℃瘮杈冿紝褰撴壘鍒頒竴涓浉絳夌殑瀛楄妭鏃訛紝鍐嶆瘮杈冨悗緇殑瀛楄妭鈥︹?閬嶅巻浜嗙獥鍙e悗寰楀嚭鏈闀垮尮閰嶃?span lang="EN-US">gzip 鐢ㄧ殑鏄縐頒綔鈥?/span>鍝堝笇琛?span lang="EN-US">鈥?/span>鐨勬柟娉曟潵瀹炵幇杈冮珮鏁堢殑鎼滅儲銆?span lang="EN-US">鈥?/span>鍝堝笇錛?span lang="EN-US">hash錛?span lang="EN-US">鈥?/span>鏄垎鏁g殑鎰忔濓紝鎶婂緟鎼滅儲鐨勬暟鎹寜鐓у瓧鑺傚煎垎鏁e埌涓涓釜鈥?/span>妗?span lang="EN-US">鈥?/span>涓紝鎼滅儲鏃跺啀鏍規嵁瀛楄妭 鍊煎埌鐩稿簲鐨?span lang="EN-US">鈥?/span>妗?span lang="EN-US">鈥?/span>涓幓瀵繪壘銆傜煭璇紡鍘嬬緝鐨勬渶鐭尮閰嶄負 3 涓瓧鑺傦紝gzip 浠?span lang="EN-US"> 3 涓瓧鑺傜殑鍊間綔涓哄搱甯岃〃鐨勭儲寮曪紝浣?span lang="EN-US"> 3 涓瓧鑺傚叡鏈?span lang="EN-US"> 2 鐨?span lang="EN-US"> 24 嬈℃柟縐嶅彇鍊鹼紝闇瑕?span lang="EN-US"> 16M 涓《錛屾《閲屽瓨鏀劇殑鏄獥鍙d腑鐨勪綅緗鹼紝紿楀彛鐨勫ぇ灝忎負 32K錛屾墍浠ユ瘡涓《鑷沖皯瑕佹湁澶т簬涓や釜瀛楄妭鐨勭┖闂達紝鍝堝笇琛ㄥ皢澶т簬 32M錛屼綔涓?span lang="EN-US"> 90 騫翠唬寮鍙戠殑紼嬪簭錛岃繖涓姹傛槸澶ぇ浜嗭紝鑰屼笖闅忕潃紿楀彛鐨勭Щ鍔紝鍝堝笇琛ㄩ噷鐨勬暟鎹細涓嶆柇榪囨椂錛岀淮鎶よ繖涔堝ぇ鐨勮〃錛屼細闄嶄綆紼嬪簭鐨勬晥鐜囷紝gzip 瀹氫箟鍝堝笇琛ㄤ負 2 鐨?span lang="EN-US"> 15 嬈℃柟錛?span lang="EN-US">32K錛変釜妗訛紝騫惰璁′簡涓涓搱甯屽嚱鏁版妸 16M 縐嶅彇鍊煎搴斿埌 32K 涓《涓紝涓嶅悓鐨勫艱瀵瑰簲鍒扮浉鍚岀殑妗朵腑鏄笉鍙伩鍏嶇殑錛屽搱甯屽嚱鏁扮殑浠誨姟鏄?span lang="EN-US">

1.浣垮悇縐嶅彇鍊煎敖鍙兘鍧囧寑鍦板垎甯冨埌鍚勪釜妗朵腑錛岄伩鍏嶈澶氫笉鍚岀殑鍊奸泦涓埌鏌愪簺妗朵腑錛岃屽彟涓浜涙槸絀烘《錛屼嬌鎼滅儲鐨勬晥鐜囬檷浣庛?/span>

2.鍑芥暟鐨勮綆楀敖鍙兘鍦扮畝鍗曪紝鍥犱負姣忔 鈥?/span>鎻掑叆鈥?/span>鍜?span lang="EN-US">鈥?/span>鎼滃鈥?/span>鍝堝笇琛ㄩ兘瑕佹墽琛屽搱甯屽嚱鏁幫紝鍝堝笇鍑芥暟鐨勫鏉傚害鐩存帴褰卞搷紼嬪簭鐨勬墽琛屾晥鐜囷紝瀹規槗鎯沖埌鐨勫搱甯屽嚱鏁版槸鍙?span lang="EN-US"> 3 涓瓧鑺傜殑宸﹁竟錛堟垨鍙寵竟錛?span lang="EN-US">15 浣嶄簩榪涘埗鍊鹼紝浣嗚繖鏍峰彧瑕佸乏杈癸紙鎴栧彸杈癸級2 涓瓧鑺傜浉鍚岋紝灝變細琚斁鍒板悓涓涓《涓紝鑰?span lang="EN-US"> 2 涓瓧鑺傜浉鍚岀殑姒傜巼鏄瘮杈冮珮鐨勶紝涓嶇鍚?span lang="EN-US">鈥?/span>騫沖潎鍒嗗竷鈥?/span>鐨勮姹傘?span lang="EN-US">

gzip 閲囩敤鐨勭畻娉曟槸錛?span lang="EN-US">A(4,5) + A(6,7,8) ^ B(1,2,3) + B(4,5) + B(6,7,8) ^ C(1,2,3) + C(4,5,6,7,8) 錛堣鏄庯細A 鎸?span lang="EN-US"> 3 涓瓧鑺備腑鐨勭 1 涓瓧鑺傦紝B 鎸囩 2 涓瓧鑺傦紝C 鎸囩 3 涓瓧鑺傦紝A(4,5) 鎸囩涓涓瓧鑺傜殑絎?span lang="EN-US"> 4,5 浣嶄簩榪涘埗鐮侊紝鈥淾鈥?/span>鏄簩榪涘埗浣嶇殑寮傛垨鎿嶄綔錛?span lang="EN-US">鈥?鈥?/span>鏄?span lang="EN-US">鈥?/span>榪炴帴鈥?/span>鑰屼笉鏄?span lang="EN-US">鈥?/span>鍔?span lang="EN-US">鈥?/span>錛?span lang="EN-US">鈥淾鈥?/span>浼樺厛浜?span lang="EN-US">鈥?鈥?/span>錛夎繖鏍蜂嬌 3 涓瓧鑺傞兘灝介噺鈥?/span>鍙備笌鈥?/span>鍒版渶鍚庣殑緇撴灉涓潵錛岃屼笖姣忎釜緇撴灉鍊?span lang="EN-US"> h 閮界瓑浜?span lang="EN-US"> ((鍓?span lang="EN-US">1涓?span lang="EN-US">h << 5) ^ c)鍙栧彸 15 浣嶏紝璁$畻涔熻繕綆鍗曘?span lang="EN-US">
鍝堝笇琛ㄧ殑鍏蜂綋瀹炵幇涔熷煎緱鎺㈣,鍥犱負鏃犳硶棰勫厛鐭ラ亾姣忎竴涓?span lang="EN-US">鈥?/span>妗?span lang="EN-US">鈥?/span>浼氬瓨鏀懼灝戜釜鍏冪礌錛屾墍浠ユ渶綆鍗曠殑錛屼細鎯沖埌鐢ㄩ摼琛ㄦ潵瀹炵幇錛氬搱甯岃〃閲屽瓨鏀劇潃姣忎釜妗剁殑絎竴涓?鍏冪礌錛屾瘡涓厓绱犻櫎浜嗗瓨鏀劇潃鑷韓鐨勫鹼紝榪樺瓨鏀劇潃涓涓寚閽堬紝鎸囧悜鍚屼竴涓《涓殑涓嬩竴涓厓绱狅紝鍙互欏虹潃鎸囬拡閾炬潵閬嶅巻璇ユ《涓殑姣忎竴涓厓绱狅紝鎻掑叆鍏冪礌鏃訛紝鍏堢敤鍝堝笇鍑芥暟 綆楀嚭璇ユ斁鍒扮鍑犱釜妗朵腑錛屽啀鎶婂畠鎸傚埌鐩稿簲閾捐〃鐨勬渶鍚庛?/span>

榪欎釜鏂規鐨勭己鐐規槸棰戠箒鍦扮敵璇峰拰閲婃斁鍐呭瓨浼氶檷浣庤繍琛岄熷害錛涘唴瀛樻寚閽堢殑瀛樻斁鍗犳嵁浜嗛澶栫殑鍐呭瓨寮閿銆?/span>

鏈夋洿灝戝唴 瀛樺紑閿鍜屾洿蹇熺殑鏂規硶鏉ュ疄鐜板搱甯岃〃錛屽茍涓斾笉闇瑕侀綣佺殑鍐呭瓨鐢寵鍜岄噴鏀撅細gzip 鍦ㄥ唴瀛樹腑鐢寵浜嗕袱涓暟緇勶紝涓涓彨 head[]錛屼竴涓彨 pre[]錛屽ぇ灝忛兘涓?span lang="EN-US"> 32K錛屾牴鎹綋鍓嶄綅緗?span lang="EN-US"> strstart 寮濮嬬殑 3 涓瓧鑺傦紝鐢ㄥ搱甯屽嚱鏁拌綆楀嚭鍦?span lang="EN-US"> head[] 涓殑浣嶇疆 ins_h錛岀劧鍚庢妸 head[ins_h] 涓殑鍊艱鍏?span lang="EN-US"> pre[strstart]錛屽啀鎶婂綋鍓嶄綅緗?span lang="EN-US"> strstart 璁板叆 head[ins_h]銆?/span>

闅忕潃鍘嬬緝鐨勮繘琛岋紝head[]閲岃杞界潃鏈榪戠殑鍙兘鐨勫尮閰嶇殑浣嶇疆錛堝鏋滄湁鍖歸厤鐨勮瘽錛?span lang="EN-US">head[ins_h]涓嶄負 0錛夛紝pre[]涓殑鎵鏈変綅緗笌鍘熷鏁版嵁鐨勪綅緗浉瀵瑰簲錛屼絾姣忎竴涓綅緗繚瀛樼殑鍊兼槸鍓嶄竴涓渶榪戠殑鍙兘鐨勫尮閰嶇殑浣嶇疆銆?/span>

錛?span lang="EN-US">鈥?/span>鍙兘鐨勫尮閰?span lang="EN-US">鈥?/span>鏄寚鍝堝笇鍑芥暟璁$畻鍑虹殑 ins_h 鐩稿悓銆傦級欏虹潃 pre[] 涓殑鎸囩ず鎵句笅鍘伙紝鐩村埌閬囧埌 0錛屽彲浠ュ緱鍒版墍鏈夊尮閰嶅湪鍘熷鏁版嵁涓殑浣嶇疆錛?span lang="EN-US">0 琛ㄧず涓嶅啀鏈夋洿榪滅殑鍖歸厤銆?span lang="EN-US">
銆銆鎺ヤ笅鏉ュ緢鑷劧鍦拌瑙傚療 gzip 鍏蜂綋鏄浣曞垽鏂搱甯岃〃涓暟鎹殑榪囨椂錛屽浣曟竻鐞嗗搱甯岃〃鐨勶紝鍥犱負 pre[] 閲屽彧鑳藉瓨鏀?span lang="EN-US"> 32K 涓厓绱狅紝鎵浠ヨ繖欏瑰伐浣滄槸蹇呴』瑕佸仛鐨勩?span lang="EN-US">
銆 銆gzip 浠庡師濮嬫枃浠朵腑璇誨嚭涓や釜紿楀彛澶у皬鐨勫唴瀹癸紙鍏?span lang="EN-US"> 64K 瀛楄妭錛夊埌涓鍧楀唴瀛樹腑錛岃繖鍧楀唴瀛樹篃鏄竴涓暟緇勶紝縐頒綔 Window[]錛涚敵璇?span lang="EN-US"> head[]銆?span lang="EN-US">pre[] 騫舵竻闆訛紱strstart 緗負 0銆?/span>

鐒跺悗 gzip 杈規悳绱㈣竟鎻掑叆錛屾悳绱㈡椂閫氳繃璁$畻 ins_h錛屾鏌?span lang="EN-US"> head[] 涓槸鍚︽湁鍖歸厤錛屽鏋滄湁鍖歸厤錛屽垽鏂?span lang="EN-US"> strstart 鍑?span lang="EN-US"> head[] 涓殑浣嶇疆鏄惁澶т簬 1 涓獥鍙g殑澶у皬錛屽鏋滃ぇ浜?span lang="EN-US"> 1 涓獥鍙g殑澶у皬錛屽氨涓嶅埌 pre[] 涓幓鎼滅儲浜嗭紝鍥犱負 pre[] 涓繚瀛樼殑浣嶇疆鏇磋繙浜嗭紝濡傛灉涓嶅ぇ浜庯紝灝遍『鐫 pre[] 鐨勬寚紺哄埌 Window[] 涓愪釜鍖歸厤浣嶇疆寮濮嬶紝閫愪釜瀛楄妭涓庡綋鍓嶄綅緗殑鏁版嵁姣旇緝錛屼互鎵懼嚭鏈闀垮尮閰嶏紝pre[] 涓殑浣嶇疆涔熻鍒ゆ柇鏄惁瓚呭嚭涓涓獥鍙o紝濡傞亣鍒拌秴鍑轟竴涓獥鍙g殑浣嶇疆鎴栬?span lang="EN-US"> 0 灝變笉鍐嶆壘涓嬪幓錛屾壘涓嶅埌鍖歸厤灝辮緭鍑哄綋鍓嶄綅緗殑鍗曚釜瀛楄妭鍒板彟澶栫殑鍐呭瓨錛堣緭鍑烘柟娉曞湪鍚庢枃涓細浠嬬粛錛夛紝騫舵妸 strstart 鎻掑叆鍝堝笇琛紝strstart 閫掑錛屽鏋滄壘鍒頒簡鍖歸厤錛屽氨杈撳嚭鍖歸厤浣嶇疆鍜屽尮閰嶉暱搴﹁繖涓や釜鏁板瓧鍒板彟澶栫殑鍐呭瓨涓紝騫舵妸 strstart 寮濮嬬殑錛岀洿鍒?span lang="EN-US"> strstart + 鍖歸厤闀垮害 涓烘鐨勬墍鏈変綅緗兘鎻掑叆鍝堝笇琛紝strstart += 鍖歸厤闀垮害銆傛彃鍏ュ搱甯岃〃鐨勬柟娉曚負錛?span lang="EN-US">
pre[strstart % 32K] = head[ins_h];
head[ins_h] = strstart;
鍙?浠ョ湅鍑猴紝pre[] 鏄驚鐜埄鐢ㄧ殑錛屾墍鏈夌殑浣嶇疆閮藉湪涓涓獥鍙d互鍐咃紝浣嗘瘡涓涓綅緗繚瀛樼殑鍊間笉涓瀹氭槸涓涓獥鍙d互鍐呯殑銆?/span>

鍦ㄦ悳绱㈡椂錛?span lang="EN-US">head[] 鍜?span lang="EN-US"> pre[] 涓殑浣嶇疆鍊煎搴斿埌 pre[] 鏃朵篃瑕?span lang="EN-US"> % 32K銆傚綋 Window[] 涓殑鍘熷鏁版嵁灝嗚澶勭悊瀹屾瘯鏃訛紝瑕佹妸 Window[] 涓悗涓紿楃殑鏁版嵁澶嶅埗鍒板墠涓紿楋紝鍐嶈鍙?span lang="EN-US"> 32K 瀛楄妭鐨勬暟鎹埌鍚庝竴紿楋紝strstart -= 32K錛岄亶鍘?span lang="EN-US"> head[]錛屽煎皬浜庣瓑浜?span lang="EN-US"> 32K 鐨勶紝緗負 0錛屽ぇ浜?span lang="EN-US"> 32K 鐨勶紝-= 32K錛?span lang="EN-US">pre[] 鍚?span lang="EN-US"> head[] 涓鏍峰鐞嗐傜劧鍚庡悓鍓嶉潰涓鏍峰鐞嗘柊涓紿楃殑鏁版嵁銆?span lang="EN-US">
銆銆鍒嗘瀽錛氱幇鍦ㄥ彲浠?鐪嬪埌錛岃櫧鐒?span lang="EN-US"> 3 涓瓧鑺傛湁 16M 縐嶅彇鍊鹼紝浣嗗疄闄呬笂涓涓獥鍙e彧鏈?span lang="EN-US"> 32K 涓彇鍊奸渶瑕佹彃鍏ュ搱甯岃〃錛岀敱浜庣煭璇紡閲嶅鐨勫瓨鍦紝瀹為檯鍙湁 < 32K 縐嶅彇鍊兼彃鍏ュ搱甯岃〃鐨?span lang="EN-US"> 32K 涓?span lang="EN-US">鈥?/span>妗?span lang="EN-US">鈥?/span>涓紝鑰屼笖鍝堝笇鍑芥暟鍙堢鍚?span lang="EN-US">鈥?/span>騫沖潎鍒嗗竷鈥?/span>鐨勮姹傦紝鎵浠ュ搱甯岃〃涓疄闄呭瓨鍦ㄧ殑鈥?/span>鍐茬獊鈥?/span>涓鑸笉浼氬錛屽鎼滅儲鏁堢巼鐨勫獎鍝嶄笉澶с傚彲浠ラ璁★紝鍦?span lang="EN-US">鈥?/span>涓鑸儏鍐?span lang="EN-US">鈥?/span>涓嬶紝姣?涓?span lang="EN-US">鈥?/span>妗?span lang="EN-US">鈥?/span>涓瓨鏀劇殑鏁版嵁錛屾鏄垜浠鎵劇殑銆?/span>

鍝堝笇琛ㄥ湪鍚勭鎼滅儲綆楁硶涓紝瀹炵幇鐩稿鐨勬瘮杈冪畝鍗曪紝瀹規槗鐞嗚В錛?span lang="EN-US">鈥?/span>騫沖潎鎼滅儲閫熷害鈥?/span>鏈蹇紝鍝堝笇鍑芥暟鐨勮璁℃槸鎼滅儲閫熷害鐨勫叧 閿紝鍙絎﹀悎鈥?/span>騫沖潎鍒嗗竷鈥?/span>鍜?span lang="EN-US">鈥?/span>璁$畻綆鍗?span lang="EN-US">鈥?/span>錛屽氨甯稿父鑳芥垚涓鴻縐嶆悳绱㈢畻娉曚腑鐨勯閫夛紝鎵浠ュ搱甯岃〃鏄渶嫻佽鐨勪竴縐嶆悳绱㈢畻娉曘?/span>

浣嗗湪鏌愪簺鐗規畩鎯呭喌涓嬶紝瀹冧篃鏈夌己鐐癸紝姣? 濡傦細1.褰撻敭鐮?span lang="EN-US"> k 涓嶅瓨鍦ㄦ椂錛岃姹傛壘鍑哄皬浜?span lang="EN-US"> k 鐨勬渶澶ч敭鐮佹垨澶т簬 k 鐨勬渶灝忛敭鐮侊紝鍝堝笇琛ㄦ棤娉曟湁鏁堢巼鍦版弧瓚寵繖縐嶈姹傘?span lang="EN-US">2.鍝堝笇琛ㄧ殑鈥?/span>騫沖潎鎼滅儲閫熷害鈥?/span>鏄緩绔嬪湪姒傜巼璁虹殑鍩虹涓婄殑錛屽洜涓轟簨鍏堜笉鑳介鐭ュ緟鎼滅儲鐨勬暟鎹泦鍚堬紝鎴戜滑鍙兘鈥?/span>淇?璧?span lang="EN-US">鈥?/span>鎼滅儲閫熷害鐨?span lang="EN-US">鈥?/span>騫沖潎鍊?span lang="EN-US">鈥?/span>錛岃屼笉鑳?span lang="EN-US">鈥?/span>淇濊瘉鈥?/span>鎼滅儲閫熷害鐨?span lang="EN-US">鈥?/span>涓婇檺鈥?/span>銆傚湪鍚屼漢綾繪у懡鏀稿叧鐨勫簲鐢ㄤ腑錛堝鍖葷枟鎴栧畤鑸鍩燂級錛屽皢鏄笉鍚堥傜殑銆?/span>

榪欎簺鎯呭喌鍙婂叾浠栦竴浜涚壒孌婃儏 鍐典笅錛屾垜浠繀欏繪眰鍔╁叾浠?span lang="EN-US">鈥?/span>騫沖潎閫熷害鈥?/span>杈冧綆錛屼絾鑳芥弧瓚崇浉搴旂殑鐗規畩瑕佹眰鐨勭畻娉曘傦紙瑙併婅綆楁満紼嬪簭璁捐鑹烘湳銆嬬3鍗?鎺掑簭涓庢煡鎵撅級銆傚垢鑰?span lang="EN-US">鈥?/span>鍦ㄧ獥鍙d腑鎼滅儲鍖歸厤瀛楄妭涓?span lang="EN-US">鈥?/span>涓嶅睘浜庣壒孌婃儏鍐點?span lang="EN-US">

鏃墮棿涓庡帇緙╃巼鐨勫鉤琛★細
gzip
瀹氫箟浜嗗嚑縐嶅彲渚涢夋嫨鐨?span lang="EN-US"> level
錛岃秺浣庣殑 level 鍘嬬緝鏃墮棿瓚婂揩浣嗗帇緙╃巼瓚婁綆錛岃秺楂樼殑 level 鍘嬬緝鏃墮棿瓚婃參浣嗗帇緙╃巼瓚婇珮銆?span lang="EN-US">
涓嶅悓鐨?span lang="EN-US"> level 瀵逛笅闈㈠洓涓彉閲忔湁涓嶅悓鐨勫彇鍊鹼細

nice_length
max_chain
max_lazy
good_length

nice_length
錛?鍓嶉潰璇磋繃錛屾悳绱㈠尮閰嶆椂錛岄『鐫 pre[] 鐨勬寚紺哄埌 Window[] 涓愪釜鍖歸厤浣嶇疆寮濮嬶紝鎵懼嚭鏈闀垮尮閰嶏紝浣嗗湪榪欒繃紼嬩腑錛屽鏋滈亣鍒頒竴涓尮閰嶇殑闀垮害杈懼埌鎴栬秴榪?span lang="EN-US"> nice_length錛屽氨涓嶅啀璇曞浘瀵繪壘鏇撮暱鐨勫尮閰嶃傛渶浣庣殑 level 瀹氫箟 nice_length 涓?span lang="EN-US"> 8錛屾渶楂樼殑 level 瀹氫箟 nice_length 涓?span lang="EN-US"> 258錛堝嵆涓涓瓧鑺傝兘琛ㄧず鐨勬渶澶х煭璇尮閰嶉暱搴?span lang="EN-US"> 3 + 255錛夈?span lang="EN-US">

max_chain錛氳繖涓艱瀹氫簡欏虹潃 pre[] 鐨勬寚紺哄線鍓嶅洖婧殑鏈澶ф鏁般傛渶浣庣殑 level 瀹氫箟 max_chain 涓?span lang="EN-US"> 4錛屾渶楂樼殑 level 瀹氫箟 max_chain 涓?span lang="EN-US"> 4096銆傚綋 max_chain 鍜?span lang="EN-US"> nice_length 鏈夊啿紿佹椂錛屼互鍏堣揪鍒扮殑涓哄噯銆?/span>



swo 2006-08-21 11:18 鍙戣〃璇勮
]]>
gzip鍘熺悊涓庡疄鐜?/title><link>http://m.shnenglu.com/swo2006/articles/11453.html</link><dc:creator>swo</dc:creator><author>swo</author><pubDate>Sat, 19 Aug 2006 06:54:00 GMT</pubDate><guid>http://m.shnenglu.com/swo2006/articles/11453.html</guid><wfw:comment>http://m.shnenglu.com/swo2006/comments/11453.html</wfw:comment><comments>http://m.shnenglu.com/swo2006/articles/11453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/swo2006/comments/commentRss/11453.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/swo2006/services/trackbacks/11453.html</trackback:ping><description><![CDATA[ <br /> <div align="center"> <center> <br /> </center> </div> <div align="center"> <table class="content" border="0" cellpadding="0" cellspacing="0" height="200" width="96%"> <tbody> <tr> <td height="200" valign="top" width="100%"> <p>聽聽聽 gzip 浣跨敤deflate綆楁硶榪涜鍘嬬緝銆倆lib錛屼互鍙婂浘褰㈡牸寮弍ng錛屼嬌鐢ㄧ殑鍘嬬緝綆楁硶涔熸槸deflate綆楁硶銆備粠gzip鐨勬簮鐮佷腑錛屾垜浠簡瑙e埌浜? defalte綆楁硶鐨勫師鐞嗗拰瀹炵幇銆傛垜闃呰鐨刧zip鐗堟湰涓? gzip-1.2.4銆備笅闈㈡垜浠皢瑕佸deflate綆楁硶鍋氫竴涓垎鏋愬拰璇存槑銆傞鍏堢畝鍗曚粙緇嶄竴涓嬪熀鏈師鐞嗭紝鐒跺悗璇︾粏鐨勪粙緇嶅疄鐜般?br /><br /><b>1 gzip 鎵浣跨敤鍘嬬緝綆楁硶鐨勫熀鏈師鐞?/b><br /><br />gzip 瀵逛簬瑕佸帇緙╃殑鏂囦歡錛岄鍏堜嬌鐢↙Z77綆楁硶鐨勪竴涓彉縐嶈繘琛屽帇緙╋紝瀵瑰緱鍒扮殑緇撴灉鍐嶄嬌鐢℉uffman緙栫爜鐨勬柟娉曪紙瀹為檯涓奼zip鏍規嵁鎯呭喌錛岄夋嫨浣跨敤闈欐? Huffman緙栫爜鎴栬呭姩鎬丠uffman緙栫爜錛岃緇嗗唴瀹瑰湪瀹炵幇涓鏄庯級榪涜鍘嬬緝銆傛墍浠ユ槑鐧戒簡LZ77綆楁硶鍜孒uffman緙栫爜鐨勫帇緙╁師鐞嗭紝涔熷氨鏄庣櫧浜? gzip鐨勫帇緙╁師鐞嗐傛垜浠潵瀵筁Z77綆楁硶鍜孒uffman緙栫爜鍋氫竴涓畝鍗曚粙緇嶃?br /><br />1.1 LZ77綆楁硶綆浠?br /><br />榪欎竴綆楁硶鏄敱Jacob Ziv 鍜?Abraham Lempel 浜?1977 騫存彁鍑猴紝鎵浠ュ懡鍚嶄負 LZ77銆?br /><br />1.1.1 LZ77綆楁硶鐨勫帇緙╁師鐞?br /><br />濡? 鏋滄枃浠朵腑鏈変袱鍧楀唴瀹圭浉鍚岀殑璇濓紝閭d箞鍙鐭ラ亾鍓嶄竴鍧楃殑浣嶇疆鍜屽ぇ灝忥紝鎴戜滑灝卞彲浠ョ‘瀹氬悗涓鍧楃殑鍐呭銆傛墍浠ユ垜浠彲浠ョ敤錛堜袱鑰呬箣闂寸殑璺濈錛岀浉鍚屽唴瀹圭殑闀垮害錛夎繖鏍蜂竴瀵? 淇℃伅錛屾潵鏇挎崲鍚庝竴鍧楀唴瀹廣傜敱浜庯紙涓よ呬箣闂寸殑璺濈錛岀浉鍚屽唴瀹圭殑闀垮害錛夎繖涓瀵逛俊鎭殑澶у皬錛屽皬浜庤鏇挎崲鍐呭鐨勫ぇ灝忥紝鎵浠ユ枃浠跺緱鍒頒簡鍘嬬緝銆?br /><br />涓嬮潰鎴戜滑鏉ヤ婦涓涓緥瀛愩?br /><br />鏈変竴涓枃浠剁殑鍐呭濡備笅<br />http://jiurl.yeah.net http://jiurl.nease.net<br /><br />鍏朵腑鏈変簺閮ㄥ垎鐨勫唴瀹癸紝鍓嶉潰宸茬粡鍑虹幇榪囦簡錛屼笅闈㈢敤()鎷搗鏉ョ殑閮ㄥ垎灝辨槸鐩稿悓鐨勯儴鍒嗐?br />http://jiurl.yeah.net (http://jiurl.)nease(.net)<br /><br />鎴戜滑浣跨敤 (涓よ呬箣闂寸殑璺濈錛岀浉鍚屽唴瀹圭殑闀垮害) 榪欐牱涓瀵逛俊鎭紝鏉ユ浛鎹㈠悗涓鍧楀唴瀹廣?br />http://jiurl.yeah.net (22,13)nease(23,4)<br /><br />(22,13)涓紝22涓虹浉鍚屽唴瀹瑰潡涓庡綋鍓嶄綅緗箣闂寸殑璺濈錛?3涓虹浉鍚屽唴瀹圭殑闀垮害銆?br />(23,4)涓紝23涓虹浉鍚屽唴瀹瑰潡涓庡綋鍓嶄綅緗箣闂寸殑璺濈錛?涓虹浉鍚屽唴瀹圭殑闀垮害銆?br />鐢變簬錛堜袱鑰呬箣闂寸殑璺濈錛岀浉鍚屽唴瀹圭殑闀垮害錛夎繖涓瀵逛俊鎭殑澶у皬錛屽皬浜庤鏇挎崲鍐呭鐨勫ぇ灝忥紝鎵浠ユ枃浠跺緱鍒頒簡鍘嬬緝銆?br /><br />1.1.2 LZ77浣跨敤婊戝姩紿楀彛瀵繪壘鍖歸厤涓?br /><br />LZ77綆楁硶浣跨敤"婊戝姩紿楀彛"鐨勬柟娉曪紝鏉ュ鎵炬枃浠朵腑鐨勭浉鍚岄儴鍒嗭紝涔熷氨鏄尮閰嶄覆銆傛垜浠厛瀵硅繖閲岀殑涓插仛涓涓鏄庯紝瀹冩槸鎸囦竴涓換鎰忓瓧鑺傜殑搴忓垪錛岃屼笉浠呬粎鏄彲浠ュ湪鏂囨湰鏂囦歡涓樉紺哄嚭鏉ョ殑閭d簺瀛楄妭鐨勫簭鍒椼傝繖閲岀殑涓插己璋冪殑鏄畠鍦ㄦ枃浠朵腑鐨勪綅緗紝瀹冪殑闀垮害闅忕潃鍖歸厤鐨勬儏鍐佃屽彉鍖栥?br /><br />LZ77 浠庢枃浠剁殑寮濮嬪寮濮嬶紝涓涓瓧鑺備竴涓瓧鑺傜殑鍚戝悗榪涜澶勭悊銆備竴涓浐瀹氬ぇ灝忕殑紿楀彛錛堝湪褰撳墠澶勭悊瀛楄妭涔嬪墠錛屽茍涓旂揣鎸ㄧ潃褰撳墠澶勭悊瀛楄妭錛夛紝闅忕潃澶勭悊鐨勫瓧鑺備笉鏂殑鍚戝悗婊? 鍔紝灝辮薄鍦ㄩ槼鍏変笅錛岄鏈虹殑褰卞瓙婊戣繃澶у湴涓鏍楓傚浜庢枃浠朵腑鐨勬瘡涓瓧鑺傦紝鐢ㄥ綋鍓嶅鐞嗗瓧鑺傚紑濮嬬殑涓詫紝鍜岀獥鍙d腑鐨勬瘡涓覆榪涜鍖歸厤錛屽鎵炬渶闀跨殑鍖歸厤涓層傜獥鍙d腑鐨勬瘡涓? 涓叉寚錛岀獥鍙d腑姣忎釜瀛楄妭寮濮嬬殑涓層傚鏋滃綋鍓嶅鐞嗗瓧鑺傚紑濮嬬殑涓插湪紿楀彛涓湁鍖歸厤涓詫紝灝辯敤(涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害) 榪欐牱涓瀵逛俊鎭紝鏉ユ浛鎹㈠綋鍓嶄覆錛岀劧鍚庝粠鍒氭墠澶勭悊瀹岀殑涓蹭箣鍚庣殑涓嬩竴涓瓧鑺傦紝緇х畫澶勭悊銆傚鏋滃綋鍓嶅鐞嗗瓧鑺傚紑濮嬬殑涓插湪紿楀彛涓病鏈夊尮閰嶄覆錛屽氨涓嶅仛鏀瑰姩鐨勮緭鍑哄綋鍓嶅鐞? 瀛楄妭銆?br /><br />澶勭悊鏂囦歡涓涓涓瓧鑺傜殑鏃跺欙紝紿楀彛鍦ㄥ綋鍓嶅鐞嗗瓧鑺備箣鍓嶏紝涔熷氨鏄繕娌℃湁婊戝埌鏂囦歡涓婏紝榪欐椂紿楀彛涓病鏈変換浣曞唴瀹癸紝琚鐞嗙殑瀛楄妭灝變細涓嶅仛鏀瑰姩鐨勮緭鍑恒傞殢鐫澶勭悊鐨勪笉鏂悜鍚庯紝紿楀彛瓚婃潵瓚婂鐨勬粦鍏ユ枃浠訛紝鏈鍚庢暣涓獥鍙f粦鍏ユ枃浠訛紝鐒跺悗鏁翠釜紿楀彛鍦ㄦ枃浠朵笂鍚戝悗婊戝姩錛岀洿鍒版暣涓枃浠剁粨鏉熴?br /><br />1.1.3 浣跨敤LZ77綆楁硶榪涜鍘嬬緝鍜岃В鍘嬬緝<br /><br />涓? 浜嗗湪瑙e帇緙╂椂錛屽彲浠ュ尯鍒嗏滄病鏈夊尮閰嶇殑瀛楄妭鈥濆拰鈥滐紙涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害錛夊鈥濓紝鎴戜滑榪橀渶瑕佸湪姣忎釜鈥滄病鏈夊尮閰嶇殑瀛楄妭鈥濇垨鑰呪滐紙涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害錛夊鈥濅箣 鍓嶏紝鏀句笂涓浣嶏紝鏉ユ寚鏄庢槸鈥滄病鏈夊尮閰嶇殑瀛楄妭鈥濓紝榪樻槸鈥滐紙涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害錛夊鈥濄傛垜浠敤0琛ㄧず鈥滄病鏈夊尮閰嶇殑瀛楄妭鈥濓紝鐢?琛ㄧず鈥滐紙涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害錛? 瀵光濄?br /><br />瀹為檯涓紝鎴戜滑灝嗗浐瀹氾紙涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害錛夊涓殑錛屸滀箣闂寸殑璺濈鈥濆拰鈥滃尮閰嶉暱搴︹濇墍浣跨敤鐨勪綅鏁般傜敱浜庢垜浠鍥哄畾鈥滀箣闂寸殑璺濈鈥濇墍 浣跨敤鐨勪綅鏁幫紝鎵浠ユ垜浠墠浣跨敤浜嗗浐瀹氬ぇ灝忕殑紿楀彛錛屾瘮濡傜獥鍙g殑澶у皬涓?2KB錛岄偅涔堢敤15浣嶏紙2^15=32K錛夊氨鍙互淇濆瓨0-32K鑼冨洿鐨勪換浣曚竴涓箋傚疄闄? 涓紝鎴戜滑榪樺皢闄愬畾鏈澶х殑鍖歸厤闀垮害錛岃繖鏍蜂竴鏉ワ紝鈥滃尮閰嶉暱搴︹濇墍浣跨敤鐨勪綅鏁頒篃灝卞浐瀹氫簡銆?br /><br />瀹為檯涓紝鎴戜滑榪樺皢璁懼畾涓涓渶灝忓尮閰嶉暱搴︼紝鍙湁褰撲袱涓覆 鐨勫尮閰嶉暱搴﹀ぇ浜庢渶灝忓尮閰嶉暱搴︽椂錛屾垜浠墠璁や負鏄竴涓尮閰嶃傛垜浠婦涓涓緥瀛愭潵璇存槑榪欐牱鍋氱殑鍘熷洜銆傛瘮濡傦紝鈥滆窛紱燴濅嬌鐢?5浣嶏紝鈥滈暱搴︹濅嬌鐢?浣嶏紝閭d箞鈥滐紙涔嬮棿鐨? 璺濈錛屽尮閰嶉暱搴︼級瀵光濆皢浣跨敤23浣嶏紝涔熷氨鏄樊1浣?涓瓧鑺傘傚鏋滃尮閰嶉暱搴﹀皬浜?涓瓧鑺傜殑璇濓紝閭d箞鐢ㄢ滐紙涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害錛夊鈥濊繘琛屾浛鎹㈢殑璇濓紝涓嶄絾娌℃湁 鍘嬬緝錛屽弽鑰屼細澧炲ぇ錛屾墍浠ラ渶瑕佷竴涓渶灝忓尮閰嶉暱搴︺?br /><br />鍘嬬緝錛?br /><br />浠庢枃浠剁殑寮濮嬪埌鏂囦歡緇撴潫錛屼竴涓瓧鑺備竴涓瓧鑺傜殑鍚戝悗榪涜澶勭悊銆傜敤褰撳墠 澶勭悊瀛楄妭寮濮嬬殑涓詫紝鍜屾粦鍔ㄧ獥鍙d腑鐨勬瘡涓覆榪涜鍖歸厤錛屽鎵炬渶闀跨殑鍖歸厤涓層傚鏋滃綋鍓嶅鐞嗗瓧鑺傚紑濮嬬殑涓插湪紿楀彛涓湁鍖歸厤涓詫紝灝卞厛杈撳嚭涓涓爣蹇椾綅錛岃〃鏄庝笅闈㈡槸涓涓? (涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害) 瀵癸紝鐒跺悗杈撳嚭(涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害) 瀵癸紝鐒跺悗浠庡垰鎵嶅鐞嗗畬鐨勪覆涔嬪悗鐨勪笅涓涓瓧鑺傦紝緇х畫澶勭悊銆傚鏋滃綋鍓嶅鐞嗗瓧鑺傚紑濮嬬殑涓插湪紿楀彛涓病鏈夊尮閰嶄覆錛屽氨鍏堣緭鍑轟竴涓爣蹇椾綅錛岃〃鏄庝笅闈㈡槸涓涓病鏈夋敼鍔ㄧ殑瀛? 鑺傦紝鐒跺悗涓嶅仛鏀瑰姩鐨勮緭鍑哄綋鍓嶅鐞嗗瓧鑺傦紝鐒跺悗緇х畫澶勭悊褰撳墠澶勭悊瀛楄妭鐨勪笅涓涓瓧鑺傘?br /><br />瑙e帇緙╋細<br /><br />浠庢枃浠跺紑濮嬪埌鏂囦歡緇撴潫錛屾瘡嬈″厛璇? 涓浣嶆爣蹇椾綅錛岄氳繃榪欎釜鏍囧織浣嶆潵鍒ゆ柇涓嬮潰鏄竴涓?涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害) 瀵癸紝榪樻槸涓涓病鏈夋敼鍔ㄧ殑瀛楄妭銆傚鏋滄槸涓涓紙涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害錛夊錛屽氨璇誨嚭鍥哄畾浣嶆暟鐨勶紙涔嬮棿鐨勮窛紱伙紝鍖歸厤闀垮害錛夊錛岀劧鍚庢牴鎹涓殑淇℃伅錛屽皢鍖歸厤涓茶緭鍑哄埌 褰撳墠浣嶇疆銆傚鏋滄槸涓涓病鏈夋敼鍔ㄧ殑瀛楄妭錛屽氨璇誨嚭涓涓瓧鑺傦紝鐒跺悗杈撳嚭榪欎釜瀛楄妭銆?br /><br />鎴戜滑鍙互鐪嬪埌錛孡Z77鍘嬬緝鏃墮渶瑕佸仛澶ч噺鐨勫尮閰嶅伐浣滐紝鑰岃В鍘嬬緝鏃墮渶瑕佸仛鐨勫伐浣滃緢灝戯紝涔熷氨鏄瑙e帇緙╃浉瀵逛簬鍘嬬緝灝嗗揩鐨勫銆傝繖瀵逛簬闇瑕佽繘琛屼竴嬈″帇緙╋紝澶氭瑙e帇緙╃殑鎯呭喌錛屾槸涓涓法澶х殑浼樼偣銆?br /><br /><br />1.2 Huffman緙栫爜綆浠?br /><br />1.2.1 Huffman緙栫爜鐨勫帇緙╁師鐞?br /><br />鎴? 浠妸鏂囦歡涓竴瀹氫綅闀跨殑鍊肩湅浣滄槸絎﹀彿錛屾瘮濡傛妸8浣嶉暱鐨?56縐嶅鹼紝涔熷氨鏄瓧鑺傜殑256縐嶅肩湅浣滄槸絎﹀彿銆傛垜浠牴鎹繖浜涚鍙峰湪鏂囦歡涓嚭鐜扮殑棰戠巼錛屽榪欎簺絎﹀彿閲嶆柊 緙栫爜銆傚浜庡嚭鐜版鏁伴潪甯稿鐨勶紝鎴戜滑鐢ㄨ緝灝戠殑浣嶆潵琛ㄧず錛屽浜庡嚭鐜版鏁伴潪甯稿皯鐨勶紝鎴戜滑鐢ㄨ緝澶氱殑浣嶆潵琛ㄧず銆傝繖鏍蜂竴鏉ワ紝鏂囦歡鐨勪竴浜涢儴鍒嗕綅鏁板彉灝戜簡錛屼竴浜涢儴鍒嗕綅鏁板彉 澶氫簡錛岀敱浜庡彉灝忕殑閮ㄥ垎姣斿彉澶х殑閮ㄥ垎澶氾紝鎵浠ユ暣涓枃浠剁殑澶у皬榪樻槸浼氬噺灝忥紝鎵浠ユ枃浠跺緱鍒頒簡鍘嬬緝銆?br /><br />1.2.2 Huffman緙栫爜浣跨敤Huffman鏍戞潵浜х敓緙栫爜<br /><br />瑕? 榪涜Huffman緙栫爜錛岄鍏堣鎶婃暣涓枃浠惰涓閬嶏紝鍦ㄨ鐨勮繃紼嬩腑錛岀粺璁℃瘡涓鍙鳳紙鎴戜滑鎶婂瓧鑺傜殑256縐嶅肩湅浣滄槸256縐嶇鍙鳳級鐨勫嚭鐜版鏁般傜劧鍚庢牴鎹鍙風殑 鍑虹幇嬈℃暟錛屽緩绔婬uffman鏍戯紝閫氳繃Huffman鏍戝緱鍒版瘡涓鍙風殑鏂扮殑緙栫爜銆傚浜庢枃浠朵腑鍑虹幇嬈℃暟杈冨鐨勭鍙鳳紝瀹冪殑Huffman緙栫爜鐨勪綅鏁版瘮杈冨皯銆傚 浜庢枃浠朵腑鍑虹幇嬈℃暟杈冨皯鐨勭鍙鳳紝瀹冪殑Huffman緙栫爜鐨勪綅鏁版瘮杈冨銆傜劧鍚庢妸鏂囦歡涓殑姣忎釜瀛楄妭鏇挎崲鎴愪粬浠柊鐨勭紪鐮併?br /><br />寤虹珛Huffman鏍戯細<br /><br />鎶婃墍鏈夌鍙風湅鎴愭槸涓涓粨鐐癸紝騫朵笖璇ョ粨鐐圭殑鍊間負瀹冪殑鍑虹幇嬈℃暟銆傝繘涓姝ユ妸榪欎簺緇撶偣鐪嬫垚鏄彧鏈変竴涓粨鐐圭殑鏍戙?br /><br />姣忔浠庢墍鏈夋爲涓壘鍑哄兼渶灝忕殑涓や釜鏍戯紝涓鴻繖涓や釜鏍戝緩绔嬩竴涓埗緇撶偣錛岀劧鍚庤繖涓や釜鏍戝拰瀹冧滑鐨勭埗緇撶偣緇勬垚涓涓柊鐨勬爲錛岃繖涓柊鐨勬爲鐨勫間負瀹冪殑涓や釜瀛愭爲鐨勫肩殑鍜屻傚姝ゅ線澶嶏紝鐩村埌鏈鍚庢墍鏈夌殑鏍戝彉鎴愪簡涓媯墊爲銆傛垜浠氨寰楀埌浜嗕竴媯礖uffman鏍戙?br /><br />閫氳繃Huffman鏍戝緱鍒癏uffman緙栫爜錛?br /><br />榪欐5Huffman鏍戯紝鏄竴媯典簩鍙夋爲錛屽畠鐨勬墍鏈夊彾瀛愮粨鐐瑰氨鏄墍鏈夌殑絎﹀彿錛屽畠鐨勪腑闂寸粨鐐規槸鍦ㄤ駭鐢烪uffman鏍戠殑榪囩▼涓笉鏂緩绔嬬殑銆?br /><br />鎴戜滑鍦℉uffman鏍戠殑鎵鏈夌埗緇撶偣鍒板畠鐨勫乏瀛愮粨鐐圭殑璺緞涓婃爣涓?錛屽彸瀛愮粨鐐圭殑璺緞涓婃爣涓?銆?br /><br />鐜板湪鎴戜滑浠庢牴鑺傜偣寮濮嬶紝鍒版墍鏈夊彾瀛愮粨鐐圭殑璺緞錛屽氨鏄竴涓?鍜?鐨勫簭鍒椼傛垜浠敤鏍圭粨鐐瑰埌涓涓彾瀛愮粨鐐硅礬寰勪笂鐨?鍜?鐨勫簭鍒楋紝浣滀負榪欎釜鍙跺瓙緇撶偣鐨凥uffman緙栫爜銆?br /><br /><br />鎴戜滑鏉ョ湅涓涓緥瀛愩?br /><br />鏈変竴涓枃浠剁殑鍐呭濡備笅<br />abbbbccccddde<br /><br />鎴戜滑緇熻涓涓嬪悇涓鍙風殑鍑虹幇嬈℃暟錛?br /><br />a b c d e<br />1 4 4 3 1<br /><br />寤虹珛Huffman鏍戠殑榪囩▼濡備笅鍥炬墍紺?</p> <p align="center"> <img alt="" src="http://dev.csdn.net/Develop/ArticleImages/25/25628/CSDN_Dev_Image_2004-3-151005380.gif" border="0" height="1280" width="480" /> </p> <p> <br />閫氳繃鏈緇堢殑Huffman鏍戯紝鎴戜滑鍙互寰楀埌姣忎釜絎﹀彿鐨凥uffman緙栫爜銆?br /><br />a 涓?110<br />b 涓?00<br />c 涓?01<br />d 涓?10<br />e 涓?111<br /><br />鎴戜滑鍙互鐪嬪埌錛孒uffman鏍戠殑寤虹珛鏂規硶灝變繚璇佷簡錛屽嚭鐜版鏁板鐨勭鍙鳳紝寰楀埌鐨凥uffman緙栫爜浣嶆暟灝戯紝鍑虹幇嬈℃暟灝戠殑絎﹀彿錛屽緱鍒扮殑Huffman緙栫爜浣嶆暟澶氥?br /><br />鍚勪釜絎﹀彿鐨凥uffman緙栫爜鐨勯暱搴︿笉涓錛屼篃灝辨槸鍙橀暱緙栫爜銆傚浜庡彉闀跨紪鐮侊紝鍙兘浼氶亣鍒頒竴涓棶棰橈紝灝辨槸閲嶆柊緙栫爜鐨勬枃浠朵腑鍙兘浼氭棤娉曞鍖哄垎榪欎簺緙栫爜銆?br />姣斿錛宎鐨勭紪鐮佷負000錛宐鐨勭紪鐮佷負0001錛宑鐨勭紪鐮佷負1錛岄偅涔堝綋閬囧埌0001鏃訛紝灝變笉鐭ラ亾0001浠h〃ac錛岃繕鏄唬琛╞銆傚嚭鐜拌繖縐嶉棶棰樼殑鍘熷洜鏄痑鐨勭紪鐮佹槸b鐨勭紪鐮佺殑鍓嶇紑銆?br />鐢變簬Huffman緙栫爜涓烘牴緇撶偣鍒板彾瀛愮粨鐐硅礬寰勪笂鐨?鍜?鐨勫簭鍒楋紝鑰屼竴涓彾瀛愮粨鐐圭殑璺緞涓嶅彲鑳芥槸鍙︿竴涓彾瀛愮粨鐐硅礬寰勭殑鍓嶇紑錛屾墍浠ヤ竴涓狧uffman緙栫爜涓嶅彲鑳戒負鍙︿竴涓狧uffman緙栫爜鐨勫墠緙錛岃繖灝變繚璇佷簡Huffman緙栫爜鏄彲浠ュ尯鍒嗙殑銆?br /><br />1.2.3 浣跨敤Huffman緙栫爜榪涜鍘嬬緝鍜岃В鍘嬬緝<br /><br />涓轟簡鍦ㄨВ鍘嬬緝鐨勬椂鍊欙紝寰楀埌鍘嬬緝鏃舵墍浣跨敤鐨凥uffman鏍戯紝鎴戜滑闇瑕佸湪鍘嬬緝鏂囦歡涓紝淇濆瓨鏍戠殑淇℃伅錛屼篃灝辨槸淇濆瓨姣忎釜絎﹀彿鐨勫嚭鐜版鏁扮殑淇℃伅銆?br /><br />鍘嬬緝錛?br /><br />璇繪枃浠訛紝緇熻姣忎釜絎﹀彿鐨勫嚭鐜版鏁般傛牴鎹瘡涓鍙風殑鍑虹幇嬈℃暟錛屽緩绔婬uffman鏍戯紝寰楀埌姣忎釜絎﹀彿鐨凥uffman緙栫爜銆傚皢姣忎釜絎﹀彿鐨勫嚭鐜版鏁扮殑淇℃伅淇濆瓨鍦ㄥ帇緙╂枃浠朵腑錛屽皢鏂囦歡涓殑姣忎釜絎﹀彿鏇挎崲鎴愬畠鐨凥uffman緙栫爜錛屽茍杈撳嚭銆?br /><br />瑙e帇緙╋細<br /><br />寰楀埌淇濆瓨鍦ㄥ帇緙╂枃浠朵腑鐨勶紝姣忎釜絎﹀彿鐨勫嚭鐜版鏁扮殑淇℃伅銆傛牴鎹瘡涓鍙風殑鍑虹幇嬈℃暟錛屽緩绔婬uffman鏍戯紝寰楀埌姣忎釜絎﹀彿鐨凥uffman緙栫爜銆傚皢鍘嬬緝鏂囦歡涓殑姣忎釜Huffman緙栫爜鏇挎崲鎴愬畠瀵瑰簲鐨勭鍙鳳紝騫惰緭鍑恒?br /><br /><b>2 gzip 鎵浣跨敤鍘嬬緝綆楁硶鐨勫疄鐜?/b><br /><br />鎴戜滑灝唃zip鐨勫疄鐜板垎鎴愬緢澶氫釜閮ㄥ垎錛屼竴涓釜鏉ヨ鏄庯紝榪欐牱鍋氱殑鍘熷洜瑙佹湰鏂囨渶鍚庝竴閮ㄥ垎銆?br />gzip 涓墍浣跨敤鐨勫悇縐嶅疄鐜版妧宸х殑鍑哄鎴栬呯伒鎰燂紝gzip 鐨勪綔鑰呭湪婧愮爜鐨勬敞閲婁腑榪涜浜嗚鏄庛?br /><br />2.1 瀵繪壘鍖歸厤涓茬殑瀹炵幇<br /><br />涓轟竴涓覆瀵繪壘鍖歸厤涓查渶瑕佽繘琛屽ぇ閲忕殑鍖歸厤宸ヤ綔錛岃屼笖鎴戜滑榪橀渶瑕佷負寰堝寰堝涓覆瀵繪壘鍖歸厤涓層傛墍浠?gzip 鍦ㄥ鎵懼尮閰嶄覆鐨勫疄鐜頒腑浣跨敤鍝堝笇琛ㄦ潵鎻愰珮閫熷害銆?br /><br />瑕佽揪鍒扮殑鐩爣鏄紝瀵逛簬褰撳墠涓詫紝鎴戜滑瑕佸湪瀹冧箣鍓嶇殑紿楀彛涓紝瀵繪壘姣忎竴涓尮閰嶉暱搴﹁揪鍒版渶灝忓尮閰嶇殑涓詫紝騫舵壘鍑哄尮閰嶉暱搴︽渶闀跨殑涓層?br /><br />鍦?gzip 涓紝鏈灝忓尮閰嶉暱搴︿負3錛屼篃灝辨槸璇達紝涓や釜涓詫紝鏈灝戣鍓?涓瓧鑺傜浉鍚岋紝鎵嶈兘綆椾綔鍖歸厤銆備負浠涔堟渶灝忓尮閰嶉暱搴︿負3錛屽皢鍦ㄥ悗闈㈣鏄庛?br /><br />gzip 瀵歸亣鍒扮殑姣忎竴涓覆錛岄鍏堜細鎶婂畠鎻掑叆鍒頒竴涓滃瓧鍏糕濅腑銆傝繖鏍峰綋浠ュ悗鏈夊拰瀹冨尮閰嶇殑涓詫紝鍙互鐩存帴浠庘滃瓧鍏糕濅腑鏌ュ嚭榪欎釜涓層?br /><br />鎻? 鍏ヤ笉鏄貢鎻掞紝鏌ヤ篃涓嶆槸涔辨煡銆傛彃鍏ョ殑鏃跺欙紝浣跨敤榪欎釜鎻掑叆涓茬殑鍓嶄笁涓瓧鑺傦紝璁$畻鍑烘彃鍏ョ殑鈥滃瓧鍏糕濅綅緗紝鐒跺悗鎶婃彃鍏ヤ覆鐨勫紑濮嬩綅緗繚瀛樺湪榪欎釜鈥滃瓧鍏糕濅綅緗腑銆傛煡鍑? 鐨勬椂鍊欙紝浣跨敤鏌ュ嚭涓茬殑鍓嶄笁涓瓧鑺傦紝璁$畻鍑衡滃瓧鍏糕濅綅緗紝鐢變簬鎻掑叆鍜屾煡鍑轟嬌鐢ㄧ殑鏄悓涓縐嶈綆楁柟娉曪紝鎵浠ュ鏋滀袱涓覆鐨勫墠涓変釜瀛楄妭鐩稿悓鐨勮瘽錛岃綆楀嚭鐨勨滃瓧鍏糕濅綅 緗偗瀹氭槸鐩稿悓鐨勶紝鎵浠ュ氨鍙互鐩存帴鍦ㄨ鈥滃瓧鍏糕濅綅緗腑錛屽彇鍑轟互鍓嶆彃鍏ユ椂錛屼繚瀛樿繘鍘葷殑閭d釜涓茬殑寮濮嬩綅緗備簬鏄煡鍑轟覆錛屽氨鎵懼埌浜嗕竴涓覆錛岃岃繖涓覆鐨勫墠涓変釜瀛楄妭鍜? 鑷繁鐨勪竴鏍鳳紙鍏跺疄鍙槸鏈夋瀬澶х殑鍙兘鏄竴鏍風殑錛屽師鍥犲悗闈㈣鏄庯級錛屾墍浠ュ氨鎵懼埌浜嗕竴涓尮閰嶄覆銆?br /><br />濡傛灉鏈夊涓覆錛屼粬浠殑鍓嶄笁涓瓧鑺傞兘鐩稿悓錛岄偅涔堜粬浠殑鈥滃瓧鍏糕濅綅緗紝涔熼兘鏄浉鍚岀殑錛屼粬浠皢琚摼鎴愪竴鏉¢摼錛屾斁鍦ㄩ偅涓滃瓧鍏糕濅綅緗笂銆傛墍浠ワ紝濡傛灉涓涓覆錛屾煡鍒頒簡涓涓滃瓧鍏糕濅綅緗紝涔熷氨鏌ュ埌浜嗕竴涓摼錛屾墍鏈夊拰瀹冨墠涓変釜瀛楄妭鐩稿悓鐨勪覆錛岄兘鍦ㄨ繖涓摼涓娿?br /><br />涔? 灝辨槸璇達紝褰撳墠涓蹭箣鍓嶇殑鎵鏈夊尮閰嶄覆琚摼鍦ㄤ簡涓涓摼涓婏紝鏀懼湪鏌愪釜鈥滃瓧鍏糕濅綅緗笂銆傝屽綋鍓嶄覆浣跨敤瀹冪殑鍓嶄笁涓瓧鑺傦紝榪涜鏌愮璁$畻錛屽氨鍙互寰楀埌榪欎釜鈥滃瓧鍏糕濅綅緗紙寰? 鍒頒簡鈥滃瓧鍏糕濅綅緗箣鍚庯紝瀹冮鍏堜篃鎶婅嚜宸遍摼鍏ュ埌榪欎釜閾句笂錛夛紝涔熷氨鎵懼埌浜嗛摼鏈夊畠鐨勬墍鏈夊尮閰嶄覆鐨勯摼錛屾墍浠ヨ鎵炬渶闀跨殑鍖歸厤錛屼篃灝辨槸閬嶅巻榪欎釜閾句笂鐨勬瘡涓涓覆錛岀湅鍜屽摢 涓覆鐨勫尮閰嶉暱搴︽渶澶с?br /><br />涓嬮潰鎴戜滑鏇村叿浣撶殑璇存槑錛屽鎵懼尮閰嶄覆鐨勫疄鐜般?br /><br />鎴戜滑鍓嶉潰鎵璇寸殑鈥滃瓧鍏糕濓紝鏄竴涓暟緇勶紝鍙仛head[]錛堜負浠涔堝彨head,鍚庨潰榪涜璇存槑錛夈?br />鎴戜滑鍓嶉潰鎵璇寸殑鈥滃瓧鍏糕濅綅緗紝鏀懼湪涓涓彨鍋歩ns_h鐨勫彉閲忎腑銆?br />鎴戜滑鍓嶉潰鎵璇寸殑閾撅紝鏄湪涓涓彨鍋歱rev[]鐨勬暟緇勪腑銆?br /><br />鎻掑叆錛?br /><br />褰撳墠瀛楄妭涓虹 strstart 涓瓧鑺傘傞氳繃絎瑂trstart,strstart+1,strstart+2,榪欎笁涓瓧鑺傦紝浣跨敤涓涓璁″ソ鐨勫搱甯屽嚱鏁扮畻鍑篿ns_h錛屼篃灝辨槸鎻掑叆鐨勪綅緗傜劧鍚庡皢褰撳墠瀛楄妭鐨勪綅緗紝鍗硈trstart錛屼繚瀛樺湪head[ins_h]涓?br />娉ㄦ剰鐢?strstart,strstart+1,strstart+2,榪欎笁涓瓧鑺傦紙涔熷氨鏄痵trstart寮濮嬪鐨勪覆鐨勫ご涓変釜瀛楄妭錛屼篃灝辨槸褰撳墠瀛楄妭鍜屼箣鍚庣殑涓や釜瀛楄妭錛夌‘瀹氫簡ins_h銆俬ead[ins_h]涓繚瀛樼殑鍙堟槸strstart錛屼篃灝辨槸榪欎釜涓插紑濮嬬殑浣嶇疆銆?br /><br />鍒ゆ柇鏄惁鏈夊尮閰嶏細<br /><br />褰? 鍓嶄覆鐨勫墠涓変釜瀛楄妭錛屼嬌鐢ㄥ搱甯屽嚱鏁扮畻鍑篿ns_h錛岃繖鏃跺鏋渉ead[ins_h]鐨勫間笉涓虹┖鐨勮瘽錛岄偅涔坔ead[ins_h]涓殑鍊鹼紝渚挎槸涔嬪墠淇濆瓨鍦ㄨ繖閲? 鐨勫彟涓涓覆鐨勪綅緗紝騫朵笖榪欎釜涓茬殑鍓嶄笁涓瓧鑺傜畻鍑虹殑ins_h錛屽拰褰撳墠涓茬殑鍓嶄笁涓瓧鑺傜畻鍑虹殑ins_h鐩稿悓銆備篃灝辨槸璇存湁鍙兘鏈夊尮閰嶃傚鏋渉ead [ins_h]鐨勫間負絀虹殑璇濓紝閭d箞鑲畾娌℃湁鍖歸厤銆?br /><br />gzip鎵浣跨敤鐨勫搱甯屽嚱鏁幫細<br /><br />gzip 鎵浣跨敤鐨勫搱甯屽嚱鏁幫紝鐢ㄤ笁涓瓧鑺傛潵璁$畻涓涓猧ns_h錛岃繖鏄敱浜庢渶灝忓尮閰嶄負涓変釜瀛楄妭銆?br /><br />瀵逛簬鐩稿悓鐨勪笁涓瓧鑺傦紝閫氳繃鍝堝笇鍑芥暟寰楀埌鐨刬ns_h蹇呯劧鏄浉鍚岀殑銆?br />鑰屼笉鍚岀殑涓変釜瀛楄妭錛岄氳繃鍝堝笇鍑芥暟鏈夊彲鑳藉緱鍒板悓涓涓猧ns_h錛屼笉榪囪繖騫朵笉瑕佺揣錛?br />褰揼zip鍙戠幇head[ins_h]涓嶇┖鍚庯紝涔熷氨鏄鏈夊彲鑳芥湁鍖歸厤涓茬殑璇濓紝浼氬閾句笂鐨勬瘡涓涓覆榪涜鐪熸鐨勪覆鐨勬瘮杈冦?br /><br />鎵浠ヤ竴涓摼涓婄殑涓詫紝鍙槸鍓嶄笁涓瓧鑺傜敤鍝堝笇鍑芥暟綆楀嚭鐨勫肩浉鍚岋紝鑰屽茍涓嶄竴瀹氬墠涓変釜瀛楄妭閮芥槸鐩稿悓鐨勩備絾鏄繖鏍峰凡緇忓緢澶х殑緙╁皬浜嗛渶瑕佽繘琛屼覆姣旇緝鐨勮寖鍥淬?br /><br />鎴戜滑鏉ュ己璋冧竴涓嬶紝鍓嶄笁涓瓧鑺傜浉鍚岀殑涓詫紝蹇呯劧鍦ㄥ悓涓涓摼涓娿傚湪鍚屼竴涓摼涓婄殑錛屼笉涓瀹氬墠涓変釜瀛楄妭閮界浉鍚屻?br /><br />涓? 鍚岀殑涓変釜瀛楄妭鏈夊彲鑳藉緱鍒板悓涓涓粨鏋滅殑鍘熷洜鏄紝涓変釜瀛楄妭錛屼竴鍏?4浣嶏紝鏈?^24縐嶅彲鑳藉箋傝屼笁涓瓧鑺傜殑鍝堝笇鍑芥暟鐨勮綆楃粨鏋滀負15浣嶏紝鏈?^15縐嶅彲鑳藉箋? 涔熷氨鏄2^24縐嶅鹼紝涓?^15縐嶅艱繘琛屽搴旓紝蹇呯劧鏄瀵逛竴鐨勶紝涔熷氨鏄錛屽繀鐒舵槸鏈夊縐嶄笁涓瓧鑺傜殑鍊鹼紝鐢ㄨ繖涓搱甯屽嚱鏁拌綆楀嚭鐨勫奸兘鏄浉鍚岀殑銆?br /><br />鑰屾垜浠嬌鐢ㄥ搱甯屽嚱鏁扮殑鐞嗙敱鏄紝瀹為檯涓婏紝鎴戜滑鍙槸鍦ㄤ竴涓獥鍙eぇ灝忕殑鑼冨洿鍐咃紙鍚庨潰灝嗕細鐪嬪埌錛夊鎵懼尮閰嶄覆錛屼竴涓獥鍙g殑澶у皬鑼冨洿鏄緢鏈夐檺鐨勶紝鑳藉嚭鐜扮殑涓変釜瀛楄妭鐨勫肩粍鍚堟儏鍐典篃鏄緢鏈夐檺鐨勶紝灝嗚繙榪滃皬浜?^24錛屼嬌鐢ㄥ悎閫傜殑鍝堝笇鍑芥暟鏄珮鏁堢殑銆?br /><br />鍓嶄笁涓瓧鑺傜浉鍚岀殑鎵鏈夌殑涓叉墍鍦ㄧ殑閾撅細<br /><br />head[ins_h] 涓殑鍊鹼紝鏈変袱涓綔鐢ㄣ備竴涓綔鐢紝鏄竴涓墠涓変釜瀛楄妭璁$畻緇撴灉涓篿ns_h鐨勪覆鐨勪綅緗傚彟涓涓綔鐢紝鏄竴涓湪prev[]鏁扮粍涓殑绱㈠紩錛岀敤榪欎釜绱㈠紩鍦╬rev []涓紝灝嗘壘鍒板墠涓涓墠涓変釜瀛楄妭璁$畻緇撴灉涓篿ns_h鐨勪覆鐨勪綅緗傚嵆prev[head[ins_h]]鐨勫鹼紙涓嶄負絀虹殑璇濓級涓哄墠涓涓墠涓変釜瀛楄妭璁$畻緇撴灉涓? ins_h鐨勪覆鐨勪綅緗?br /><br />prev[]鐨勫鹼紝涔熸湁涓や釜浣滅敤銆備竴涓綔鐢紝鏄竴涓墠涓変釜瀛楄妭璁$畻緇撴灉涓篿ns_h鐨勪覆鐨勪綅緗傚彟涓涓綔鐢紝鏄竴 涓湪prev[]鏁扮粍涓殑绱㈠紩錛岀敤榪欎釜绱㈠紩鍦╬rev[]涓紝灝嗘壘鍒板墠涓涓墠涓変釜瀛楄妭璁$畻緇撴灉涓篿ns_h鐨勪覆鐨勪綅瀛愬搱銆傚嵆prev[]鐨勫鹼紙涓嶄負絀虹殑 璇濓級涓哄墠涓涓笁涓瓧鑺傝綆楃粨鏋滀負ins_h鐨勪覆鐨勪綅緗?br /><br />鐩村埌prev[]涓虹┖錛岃〃紺洪摼緇撴潫銆?br /><br />鎴戜滑鏉ヤ婦涓涓緥瀛愶紝涓詫紝<br />0abcd abce,abcf_abcg<br /><br />褰撳鐞嗗埌abcg鐨刟鏃訛紝鐢盿bcg鐨刟bc綆楀嚭ins_h銆?br />榪欐椂鐨刪ead[ins_h]涓負 11錛屽嵆涓?abcf abcg"鐨勫紑濮嬩綅緗?br />榪欐椂鐨刾rev[11]涓負 6錛屽嵆涓?abce abcf abcg"鐨勫紑濮嬩綅緗?br />榪欐椂鐨刾rev[6]涓負 1錛屽嵆涓?abcd abce abcf abcg"鐨勫紑濮嬩綅緗?br />榪欐椂鐨刾rev[1]涓負 0銆傝〃紺洪摼緇撴潫浜嗐?br /><br />鎴戜滑鐪嬪埌鎵鏈夊ご涓変釜瀛楁瘝涓篴bc鐨勪覆錛岃閾懼湪浜嗕竴璧鳳紝浠巋ead鍙互涓鐩存壘涓嬪幓錛岀洿鍒版壘鍒?銆?br /><br />閾劇殑寤虹珛錛?br /><br />gzip 鍦ㄦ瘡嬈″鐞嗗綋鍓嶄覆鐨勬椂鍊欙紝棣栧厛鐢ㄥ綋鍓嶄覆鐨勫墠涓変釜瀛楄妭璁$畻鍑篿ns_h錛岀劧鍚庯紝灝辮鎶婂綋鍓嶇殑涓蹭篃鎻掑叆鍒扮浉搴旂殑閾句腑錛屼篃灝辨槸鎶婂綋鍓嶇殑涓茬殑浣嶇疆錛屼繚瀛樺埌 head[ins_h] 涓紝鑰屾鏃訛紝head[ins_h] 涓紙涓嶇┖鐨勮瘽錛変負鍓嶄竴涓覆鐨勫紑濮嬩綅緗傛墍浠ヨ繖鏃跺欓渶瑕佹妸鍓嶄竴涓覆鐨勪綅緗紝涔熷氨鏄師鏉ョ殑head[ins_h]鏀懼叆閾句腑銆備簬鏄妸鐜板湪鐨刪ead [ins_h]鐨勫鹼紝鐢ㄥ綋鍓嶄覆鐨勪綅緗仛绱㈠紩錛屼繚瀛樺埌 prev[] 涓傜劧鍚庡啀鎶?head[ins_h] 璧嬪間負褰撳墠涓茬殑浣嶇疆銆?br /><br />濡傛灉褰撳墠涓茬殑浣嶇疆涓簊trstart鐨勮瘽錛岄偅涔堜篃灝辨槸<br />prev[strstart] = head[ins_h];<br />head[ins_h] = strstart;<br /><br />灝辮繖鏍鳳紝姣忔鎶婁竴涓覆鐨勪綅緗姞鍏ュ埌閾句腑錛岄摼灝卞艦鎴愪簡銆?br /><br />鐜板湪鎴戜滑涔熷氨鐭ラ亾浜嗭紝鍓嶄笁涓瓧鑺傝綆楀緱鍒板悓涓ins_h鐨勬墍鏈夌殑涓茶閾懼湪浜嗕竴璧鳳紝head[ins_h]涓洪摼澶達紝prev[]鏁扮粍涓斁鐫鐨勬洿鏃╃殑涓茬殑浣嶇疆銆俬ead鏁扮粍鍜宲rev鏁扮粍鐨勫悕瀛楋紝涔熸鍙嶅簲浜嗕粬浠殑浣滅敤銆?br /><br />閾劇殑鐗圭偣錛?br /><br />瓚婂悜鍓嶏紙prev錛変笌褰撳墠澶勭悊浣嶇疆涔嬮棿鐨勮窛紱昏秺澶с傛瘮濡傦紝褰撳墠澶勭悊涓詫紝綆楀嚭浜唅ns_h錛岃屼笖head[ins_h]涓殑鍊間笉絀猴紝閭d箞head[ins_h]灝辨槸紱誨綋鍓嶅鐞嗕覆璺濈鏈榪戠殑涓涓彲鑳界殑鍖歸厤涓詫紝騫朵笖欏虹潃prev[]鍚戝墠鎵鎵懼埌鐨勪覆錛岃秺鏉ヨ窛紱昏秺榪溿?br /><br />鍖歸厤涓蹭腑鐨勫瓧鑺傚紑濮嬬殑涓茬殑鎻掑叆錛?br /><br />鎴戜滑璇磋繃浜嗭紝鎵鏈夊瓧鑺傚紑濮嬬殑涓詫紝閮藉皢琚彃鍏モ滃瓧鍏糕濄傚浜庣‘瀹氫簡鐨勫尮閰嶄覆錛屽尮閰嶄覆涓殑姣忎釜瀛楄妭寮濮嬬殑涓詫紝浠嶈琚彃鍏モ滃瓧鍏糕濓紝浠ヤ究鍚庨潰涓插彲浠ュ拰浠栦滑榪涜鍖歸厤銆?br /><br />娉ㄦ剰錛?br /><br />瀵? 浜庢枃浠朵腑鐨勭0瀛楄妭錛屾儏鍐靛緢鐗規畩錛屽畠寮濮嬬殑涓茬殑浣嶇疆涓?銆傛墍浠ョ0涓茬殑鍓嶄笁涓瓧鑺傝綆楀嚭ins_h涔嬪悗錛屽湪head[ins_h]涓繚瀛樼殑浣嶇疆涓?銆傝屽 鏄惁鏈夊彲鑳芥湁鍖歸厤鐨勫垽鏂紝灝辨槸閫氳繃head[ins_h]涓嶄負0錛屽茍涓攈ead[ins_h]鐨勫間負涓涓覆鐨勫紑濮嬩綅緗傛墍浠ョ0瀛楄妭寮濮嬬殑涓詫紝鐢變簬鍏剁壒孌? 鎬э紝灝嗕笉浼氳鐢ㄦ潵鍖歸厤錛屼笉榪囪繖縐嶆儏鍐靛彧浼氬嚭鐜板湪絎?涓瓧鑺傦紝鎵浠ラ氬父涓嶄細閫犳垚褰卞搷錛屽嵆浣垮獎鍝嶏紝涔熶細鏋佸皬銆?br /><br />渚嬪錛屾枃浠跺唴瀹逛負<br /><br />jiurl jiurl<br /><br />鎵懼埌鐨勫尮閰嶆儏鍐靛涓嬶紝[]鎵鎷儴鍒嗐?br /><br />jiurl j[iurl]<br /><br />2.2 鎳掓儼鍟婂尮閰嶏紙lazy match錛?br /><br />瀵? 浜庡綋鍓嶅瓧鑺傚紑濮嬬殑涓詫紝瀵繪壘鍒頒簡鏈闀垮尮閰嶄箣鍚庯紝gzip騫朵笉绔嬪嵆鍐沖畾浣跨敤榪欎釜涓茶繘琛屾浛鎹€傝屾槸鐪嬬湅榪欎釜鍖歸厤闀垮害鏄惁婊℃剰錛屽鏋滃尮閰嶉暱搴︿笉婊℃剰錛岃屼笅涓涓瓧鑺? 寮濮嬬殑涓蹭篃鏈夊尮閰嶄覆鐨勮瘽錛岄偅涔坓zip灝辨壘鍒頒笅涓涓瓧鑺傚紑濮嬬殑涓茬殑鏈闀垮尮閰嶏紝鐪嬬湅鏄笉鏄瘮鐜板湪榪欎釜闀褲傝繖鍙噿鎯板晩鍖歸厤銆傚鏋滄瘮鐜板湪榪欎釜闀跨殑璇濓紝灝嗕笉浣跨敤鐜? 鍦ㄧ殑榪欎釜鍖歸厤銆傚鏋滄瘮鐜板湪榪欎釜鐭殑璇濓紝灝嗙‘瀹氫嬌鐢ㄧ幇鍦ㄧ殑榪欎釜鍖歸厤銆?br /><br />鎴戜滑鏉ヤ婦涓緥瀛愶紝涓?br /><br />0abc bcde abcde<br /><br />澶勭悊鍒扮10瀛楄妭鏃訛紝涔熷氨鏄?abcde"鐨刟鏃訛紝鎵懼埌鏈闀垮尮閰嶇殑鎯呭喌濡備笅錛孾]鎵鎷儴鍒嗐?br /><br />0abc bcde [abc]de<br /><br />榪欐椂錛屽啀鐪嬬湅涓嬩竴涓瓧鑺傦紝涔熷氨鏄11瀛楄妭鐨勬儏鍐碉紝涔熷氨鏄?abcde"鐨刡錛屾壘鍒版渶闀垮尮閰嶇殑鎯呭喌濡備笅錛孾]鎵鎷儴鍒嗐?br /><br />0abc bcde a[bcde]<br /><br />鍙戠幇絎簩嬈″尮閰嶇殑鍖歸厤闀垮害澶э紝灝變笉浣跨敤絎竴嬈$殑鍖歸厤涓層傛垜浠篃鐪嬪埌浜嗗鏋滀嬌鐢ㄧ涓嬈″尮閰嶇殑璇濓紝灝嗛敊榪囨洿闀跨殑鍖歸厤涓層?br /><br />鍦ㄦ弧瓚蟲噿鎯板晩鍖歸厤鐨勫墠鎻愭潯浠朵笅錛屾噿鎯板晩鍖歸厤涓嶉檺鍒舵鏁幫紝涓嬈℃噿鎯板晩鍖歸厤鍙戠幇浜嗘洿闀跨殑鍖歸厤涓蹭箣鍚庯紝浠嶄細鍐嶈繘琛屾噿鎯板晩鍖歸厤錛屽鏋滆繖嬈℃噿鍖歸厤錛屽彂鐜頒簡鏇撮暱鐨勫尮閰嶄覆錛岄偅涔堜笂涓嬈$殑鎳掑尮閰嶆壘鍒扮殑鍖歸厤涓插氨涓嶇敤浜嗐?br /><br />榪? 琛屾噿鎯板晩鍖歸厤鏄湁鏉′歡鐨勩傝繘琛屾噿鎯板晩鍖歸厤蹇呴』婊¤凍涓や釜鏉′歡錛岀涓錛屼笅涓涓鐞嗗瓧鑺傚紑濮嬬殑涓詫紝瑕佹湁鍖歸厤涓詫紝濡傛灉涓嬩竴涓鐞嗗瓧鑺傚紑濮嬬殑涓叉病鏈夊尮閰嶄覆鐨勮瘽錛岄偅涔? 灝辯‘瀹氫嬌鐢ㄥ綋鍓嶇殑鍖歸厤涓詫紝涓嶈繘琛屾噿鍖歸厤銆傜浜岋紝褰撳墠鍖歸厤涓茬殑鍖歸厤闀垮害錛実zip涓嶆弧鎰忥紝涔熷氨鏄綋鍓嶅尮閰嶉暱搴﹀皬浜巑ax_lazy_match 錛坢ax_lazy_match鍦ㄥ浐瀹氱殑鍘嬬緝綰у埆涓嬶紝鏈夊浐瀹氱殑鍊鹼級銆?br /><br />璁ㄨ錛?br /><br />鎴戜滑鍙互鐪嬪埌浜嗗仛鍙﹀涓嬈″皾璇曠殑鍘熷洜銆傚鏋滃綋鍓嶄覆鏈夊尮閰嶅氨浣跨敤浜嗙殑璇濓紝鍙兘閿欒繃鏇撮暱鍖歸厤鐨勬満浼氥備嬌鐢ㄦ噿鎯板晩鍖歸厤浼氭湁鎵鏀瑰杽銆?br />涓嶈繃浠庢垜綆鍗曠殑鍒嗘瀽鏉ョ湅錛屼嬌鐢ㄦ噿鎯板晩鍖歸厤瀵瑰帇緙╃巼鐨勬敼鍠勪技涔庢槸闈炲父鏈夐檺鐨勩?br /><br />2.3 澶т簬64KB鐨勬枃浠訛紝紿楀彛鐨勫疄鐜?br /><br />紿楀彛鐨勫疄鐜幫細<br /><br />瀹為檯涓紝褰撳墠涓詫紙褰撳墠澶勭悊瀛楄妭寮濮嬬殑涓詫級鍙槸鍦ㄥ畠涔嬪墠鐨勭獥鍙d腑瀵繪壘鍖歸厤涓茬殑錛屼篃灝辨槸璇村彧鏄湪瀹冧箣鍓嶇殑涓瀹氬ぇ灝忕殑鑼冨洿鍐呭鎵懼尮閰嶄覆鐨勩傛湁榪欎釜闄愬埗鐨勫師鍥狅紝灝嗗湪鍚庨潰璇存槑銆?br /><br />gzip 鐨勭獥鍙eぇ灝忎負 WSIZE錛?2KB銆?br /><br />鍐呭瓨涓湁涓涓彨window[]鐨勭紦鍐插尯錛屽ぇ灝忎負2涓獥鍙g殑澶у皬錛屼篃灝辨槸64KB銆傛枃浠剁殑鍐呭灝嗚璇誨埌榪欎釜window[]涓紝鎴戜滑鍦╳indow[]涓婅繘琛孡Z77閮ㄥ垎鐨勫鐞嗭紝寰楀埌緇撴灉灝嗘斁鍦ㄥ叾浠栫紦鍐插尯涓?br /><br />gzip 瀵箇indow[]涓殑鍐呭錛屼粠寮濮嬪寮濮嬶紝涓涓瓧鑺備竴涓瓧鑺傜殑鍚戝悗澶勭悊銆傛湁涓涓寚閽堝彨strstart錛堝叾瀹炴槸涓儲寮曪級錛屾寚鍚戝綋鍓嶅鐞嗗瓧鑺傦紝褰撳綋鍓嶅鐞? 瀛楄妭寮濮嬬殑涓叉病鏈夊尮閰嶆椂錛屼笉鍋氭敼鍔ㄧ殑杈撳嚭褰撳墠澶勭悊瀛楄妭錛宻trstart鍚戝悗縐誨姩涓涓瓧鑺傘傚綋褰撳墠澶勭悊瀛楄妭寮濮嬬殑涓叉壘鍒頒簡鍖歸厤鏃訛紝杈撳嚭錛堝尮閰嶉暱搴︼紝鐩擱殧璺? 紱伙級瀵癸紝strstart鍚戝悗縐誨姩鍖歸厤闀垮害涓瓧鑺傘傛垜浠妸strstart鍒皐indow[]緇撴潫鐨勮繖閮ㄥ垎鍐呭錛屽彨鍋?lookahead buffer錛岃秴鍓嶆煡鐪嬬紦鍐插尯銆傝繖鏍峰彨鐨勫師鍥犳槸錛屽湪鎴戜滑澶勭悊褰撳墠瀛楄妭鐨勬椂鍊欙紝灝遍渶瑕佽鍑轟箣鍚庣殑瀛楄妭鏉ヨ繘琛屼覆鐨勫尮閰嶃傚湪涓涓彉閲弆ookahead涓紝淇濆瓨 鐫瓚呭墠鏌ョ湅緙撳啿鍖烘墍鍓╃殑瀛楄妭鏁般俵ookahead錛屾渶寮濮嬭鍒濆鍖栦負鏁翠釜璇誨叆鍐呭鐨勫ぇ灝忥紝闅忕潃澶勭悊鐨勮繘琛岋紝strstart涓嶆柇鍚庣Щ錛岃秴鍓嶆煡鐪嬬紦鍐插尯涓? 鏂噺灝忥紝lookahead鐨勫間篃涓嶆柇鐨勫噺灝忋?br /><br />鎴戜滑闇瑕侀檺鍒舵煡鎵懼尮閰嶄覆鐨勮寖鍥翠負涓涓獥鍙g殑澶у皬錛堣繖涔堝仛鐨勫師鍥犲悗闈㈣鏄庯級錛屼篃灝辨槸璇達紝鍙兘 鍦ㄥ綋鍓嶅鐞嗗瓧鑺備箣鍓嶇殑32KB鐨勮寖鍥村唴瀵繪壘鍖歸厤涓層傝岋紝鐢變簬澶勭悊鏄湪2涓獥鍙eぇ灝忥紝涔熷氨鏄?4KB澶у皬鐨勭紦鍐插尯涓繘琛岀殑錛屾墍浠ュ尮閰嶉摼涓婄殑涓蹭笌褰撳墠涓蹭箣闂寸殑 璺濈鏄緢鏈夊彲鑳借秴榪?2KB鐨勩傞偅涔坓zip鏄浣曟潵瀹炵幇榪欎釜闄愬埗鐨勫憿錛?br /><br />gzip 閫氳繃鍖歸厤鏃剁殑鍒ゆ柇鏉′歡鏉ュ疄鐜拌繖涓檺鍒躲傚綋褰撳墠涓茶綆梚ns_h錛屽彂鐜癶ead[ins_h]鍊間笉涓虹┖鏃訛紙head[ins_h]涓轟竴涓覆鐨勫紑濮嬩綅緗級錛岃 鏄庡綋鍓嶄覆鏈夊彲鑳芥湁鍖歸厤涓詫紝鎶婅繖涓間繚瀛樺湪 hash_head涓傝繖鏃跺氨瑕佸仛涓涓檺鍒惰寖鍥寸殑鍒ゆ柇錛宻trstart - hash_head <= 紿楀彛澶у皬錛宻trstart-hash_head 鏄綋鍓嶄覆鍜屾渶榪戠殑鍖歸厤涓蹭箣闂寸殑璺濈錛岋紙娉ㄦ剰鍓嶉潰璇磋繃錛岄摼澶村拰褰撳墠涓茬殑璺濈鏈榪戯紝瓚婂悜鍓嶏紙prev錛変笌褰撳墠澶勭悊浣嶇疆涔嬮棿鐨勮窛紱昏秺澶э級錛屼篃灝辨槸璇磋鍒ゆ柇褰撳墠涓? 鍜岃窛紱繪渶榪戠殑鍖歸厤涓蹭箣闂寸殑璺濈鏄惁鍦ㄤ竴涓獥鍙g殑鑼冨洿涔嬪唴銆傚鏋滀笉鏄殑璇濓紝閭d箞閾句笂鐨勫叾浠栦覆鑲畾鏇磋繙錛岃偗瀹氭洿涓嶅湪涓涓獥鍙g殑鑼冨洿涔嬪唴錛屽氨涓嶈繘琛屽尮閰嶅鐞嗕簡銆? 濡傛灉鏄湪涓涓獥鍙g殑鑼冨洿涔嬪唴鐨勮瘽錛岃繕闇瑕佸湪閾句笂瀵繪壘鏈闀跨殑鍖歸厤涓詫紝鍦ㄥ拰姣忎釜涓茶繘琛屾瘮杈冪殑鏃跺欙紝涔熼渶瑕佸垽鏂綋鍓嶄覆鍜岃涓茬殑璺濈鏄惁瓚呰繃涓涓獥鍙g殑鑼冨洿錛岃秴榪? 鐨勮瘽錛屽氨涓嶈兘榪涜鍖歸厤銆?br /><br />瀹為檯涓紝gzip涓轟簡浣夸唬鐮佺畝鍗曠偣錛岃窛紱婚檺鍒惰姣斾竴涓獥鍙g殑澶у皬榪樿灝忎竴鐐廣?br /><br />灝忎簬64KB鐨勬枃浠訛細<br /><br />鍒濆鍖栫殑鏃跺欙紝浼氶鍏堜粠鏂囦歡涓64KB鐨勫唴瀹瑰埌window[]涓?br /><br />瀵逛簬灝忎簬64KB鐨勬枃浠訛紝鏁翠釜鏂囦歡閮借璇誨叆鍒皐indow[]涓傚湪window[]涓婅繘琛孡Z77鐨勫鐞嗭紝浠庡紑濮嬬洿鍒版枃浠剁粨鏉熴?br /><br />澶т簬64KB鐨勬枃浠訛細<br /><br />姣? 澶勭悊涓涓瓧鑺傞兘瑕佸垽鏂?lookahead < MIN_LOOKAHEAD 錛屼篃灝辨槸window涓繕娌℃湁澶勭悊鐨勫瓧鑺傛槸鍚﹁繕澶烳IN_LOOKAHEAD 錛屽鏋滀笉澶熺殑璇濓紝灝變細瀵艱嚧 fill_window()錛屼粠鏂囦歡涓鍐呭鍒皐indow[]涓傜敱浜庢垜浠竴嬈℃渶澶у彲鑳戒嬌鐢ㄧ殑瓚呭墠鏌ョ湅緙撳啿鍖虹殑澶у皬涓猴紝鏈澶у尮閰嶉暱搴︼紙258涓瓧鑺傦紝鍚? 闈㈣繘琛岃鏄庯級鍔犱笂鏈灝忓尮閰嶉暱搴︼紝涔熷氨鏄笅涓涓鐞嗗瓧鑺傚紑濮嬬殑涓詫紝鍙互鎵懼埌涓涓渶澶у尮閰嶉暱搴︾殑鍖歸厤錛屽彂鐢熷尮閰嶄箣鍚庯紝榪樿棰勮涓涓渶灝忓尮閰嶉暱搴︽潵璁$畻涔嬪悗鐨? ins_h銆?br /><br />涓嶇鏄ぇ浜?4KB鐨勬枃浠訛紝榪樻槸灝忎簬64KB鐨勬枃浠訛紝闅忕潃澶勭悊鐨勮繘琛岋紝鏈緇堥兘瑕佸埌鏂囦歡鐨勭粨鏉燂紝鍦ㄦ帴榪戞枃浠剁粨鏉熺殑鏃跺欙紝閮戒細鍑? 鐜?lookahead < MIN_LOOKAHEAD 錛屽浜庤繖縐嶆儏鍐碉紝fill_window() 璇繪枃浠訛紝灝卞啀璇諱笉鍑烘枃浠跺唴瀹逛簡錛屼簬鏄痜ill_window()浼氳緗竴涓爣蹇梕ofile錛岃〃紺烘枃浠跺氨瑕佺粨鏉熶簡錛屼箣鍚庤偗瀹氫細鎺ョ潃閬囧埌 lookahead < MIN_LOOKAHEAD 錛屼笉榪囩敱浜庤緗簡 eofile 鏍囧織錛屽氨涓嶄細鍐嶅幓璇曞浘璇繪枃浠跺埌window[]涓簡銆?br /><br />鍘嬬緝寮濮嬩箣鍓嶇殑鍒濆鍖栵紝浼氫粠鏂囦歡涓鍏?4KB鐨勫唴瀹瑰埌window[]涓紝紿楀彛澶у皬涓?2KB錛屼篃灝辨槸璇誨叆2紿楃殑鍐呭鍒皐indow[]涓傛垜浠妸絎竴紿楃殑鍐呭鍙仛w1_32k錛岀浜岀獥鐨勫唴瀹瑰彨鍋歸2_32k銆?br /><br />鍘? 緙╀笉鏂繘琛岋紝鐩村埌 lookahead < MIN_LOOKAHEAD錛屼篃灝辨槸澶勭悊鍒頒簡64KB鍐呭鐨勬帴榪戠粨鏉熼儴鍒嗭紝涔熷氨鏄鏋滃啀澶勭悊錛岃秴鍓嶆煡鐪嬬紦鍐插尯涓殑鍐呭灝卞彲鑳戒笉澶熶簡銆傜敱浜? lookahead < MIN_LOOKAHEAD 錛屽皢鎵ц fill_window()銆?br /><br />fill_window() 鍒ゆ柇鏄惁鍘嬬緝宸茬粡榪涜鍒頒簡2紿楀唴瀹瑰揩鐢ㄥ畬浜嗭紝璇ユ妸鏂扮殑鍐呭鏀捐繘鏉ヤ簡銆傚鏋滄槸鐨勮瘽錛?br /><br />fill_window() 鎶婄浜岀獥鐨勫唴瀹?w2_32k錛屽鍒跺埌絎竴紿椾腑錛岀涓紿椾腑鐨勫唴瀹瑰氨琚鐩栨帀浜嗭紝鐒跺悗瀵筸atch_start,strstart涔嬬被鐨勭儲寮曪紝鍋氫慨姝c?br />鐒跺悗鏇存柊鍖歸厤閾劇殑閾懼ご鏁扮粍錛宧ead[]錛屼粠澶村埌灝捐繃涓閬嶏紝濡傛灉榪欎釜澶翠腑淇濆瓨鐨勪覆鐨勪綅緗紝鍦╳2_32k涓紝灝卞榪欎釜涓茬殑浣嶇疆鍋氫慨姝c?br />濡傛灉榪欎釜澶翠腑淇濆瓨鐨勪覆鐨勪綅緗紝鍦╳1_32k涓紝灝變笉瑕佷簡錛岃涓虹┖錛屽洜涓虹涓紿楃殑鍐呭鎴戜滑宸茬粡瑕嗙洊鎺変簡銆?br />鐒跺悗鏇存柊prev[]鏁扮粍錛屼粠澶村埌灝捐繃涓閬嶏紝濡傛灉鏌愰」鐨勫唴瀹癸紝鍦╳2_32k涓紝灝卞仛淇銆傚鏋滆繖欏圭殑鍐呭錛屽湪w1_32k涓紝灝變笉瑕佷簡錛岃涓虹┖錛屽洜涓虹涓紿楃殑鍐呭鎴戜滑宸茬粡瑕嗙洊鎺変簡銆?br /><br />鏈鍚巉ill_window()浠庢枃浠朵腑鍐嶈鍑轟竴紿楀唴瀹癸紝涔熷氨鏄鍑?2KB鐨勫唴瀹癸紝澶嶅埗鍒扮浜屼釜紿椾腑錛屾敞鎰忕浜屼釜紿楀彛涓師鏉ョ殑鍐呭錛屽凡緇忚澶嶅埗鍒頒簡絎竴涓獥鍙d腑銆?br /><br />灝辮繖鏍鳳紝涓紿楃獥鐨勫鐞嗭紝鐩村埌鏁翠釜鏂囦歡緇撴潫銆?br /><br />鍒嗘瀽錛?br /><br />鍒? 絎簩紿楁枃浠跺唴瀹逛篃蹇澶勭悊瀹岀殑鏃跺欙紝鎵嶄細浠庢枃浠朵腑璇誨叆鏂扮殑鍐呭銆傝岃繖鏃訛紝絎竴紿椾腑鐨勬墍鏈変覆錛屽浜庡綋鍓嶅鐞嗗瓧鑺傚拰涔嬪悗鐨勫瓧鑺傛潵璇達紝宸茬粡瓚呭嚭浜嗕竴涓獥鍙g殑璺? 紱伙紝褰撳墠澶勭悊瀛楄妭鍜屼箣鍚庣殑瀛楄妭涓嶈兘鍜岀涓紿楃殑涓茶繘琛屽尮閰嶄簡錛屼篃灝辨槸璇寸涓紿楃殑鍐呭宸茬粡娌℃湁鐢ㄤ簡銆傛墍鏈夋彃鍏ュ瓧鍏哥殑絎竴紿楃殑涓蹭篃宸茬粡娌℃湁鐢ㄤ簡銆傛墍浠ヨ鐩栫涓紿? 鐨勫唴瀹規槸鍚堢悊鐨勶紝灝嗗瓧鍏鎬腑絎竴紿楃殑涓茬殑寮濮嬩綅緗兘璁句負絀轟篃鏄悎鐞嗙殑銆?br /><br />灝嗙浜岀獥鐨勫唴瀹瑰鍒跺埌絎竴紿椾腑錛岄偅涔堢浜岀獥鍦ㄥ瓧鍏鎬腑鐨勬墍鏈夌儲寮曢兘闇瑕佸仛鐩稿簲鐨勪慨姝c?br /><br />鐢? 浜庣浜岀獥鐨勫唴瀹瑰凡緇忓鍒跺埌浜嗙涓紿椾腑錛屾墍浠ユ垜浠彲浠ュ皢鏂扮殑鍐呭璇誨叆鍒扮浜岀獥涓紝鏂扮殑鍐呭涔嬪墠鐨?2KB鐨勫唴瀹癸紝灝辨槸鍘熸潵鐨勭浜岀獥涓殑鍐呭銆傝岃繖鏃訛紝鍋氳繃淇? 姝g殑瀛楀吀涓紝浠嶇劧鏈夊師鏉ョ浜岀獥涓墍鏈変覆鐨勪俊鎭紝涔熷氨鏄錛屾柊鐨勫唴瀹癸紝鍙互緇х畫鍒╃敤鍓嶉潰涓涓獥鍙eぇ灝忕殑鑼冨洿涔嬪唴鐨勪覆錛岃繘琛屽帇緙╋紝榪欎篃鏄悎鐞嗙殑銆?br /><br />2.4 鍏朵粬闂1<br /><br />鐜? 鍦ㄦ潵璇存槑涓涓嬶紝涓轟粈涔堟渶灝忓尮閰嶉暱搴︿負3涓瓧鑺傘傝繖鏄敱浜庯紝gzip 涓紝(鍖歸厤闀垮害錛岀浉闅旇窛紱?瀵逛腑錛?鍖歸厤闀垮害"鐨勮寖鍥翠負3-258錛屼篃灝辨槸256縐嶅彲鑳藉鹼紝闇瑕?bit鏉ヤ繚瀛樸?鐩擱殧璺濈"鐨勮寖鍥翠負0-32K錛岄渶瑕? 15bit鏉ヤ繚瀛樸傛墍浠ヤ竴涓?鍖歸厤闀垮害錛岀浉闅旇窛紱?瀵歸渶瑕?3浣嶏紝宸竴浣?涓瓧鑺傘傚鏋滃尮閰嶄覆灝忎簬3涓瓧鑺傜殑璇濓紝浣跨敤(鍖歸厤闀垮害錛岀浉闅旇窛紱?瀵硅繘琛屾浛鎹紝 涓嶄絾娌℃湁鍘嬬緝錛屽弽鑰岃繕浼氬澶с傛墍浠ヤ繚瀛?鍖歸厤闀垮害錛岀浉闅旇窛紱?瀵規墍闇瑕佺殑浣嶆暟錛屽喅瀹氫簡鏈灝忓尮閰嶉暱搴﹁嚦灝戣涓?涓瓧鑺傘?br /><br />鏈澶у尮閰嶉暱搴︿負258鐨勫師鍥犳槸錛岀患鍚堝悇縐嶅洜绱狅紝鍐沖畾鐢?浣嶆潵淇濆瓨鍖歸厤闀垮害錛?浣嶇殑鏈澶у間負255銆傚疄闄呬腑錛屾垜浠湪(鍖歸厤闀垮害錛岀浉闅旇窛紱?瀵逛腑鐨勨滃尮閰嶉暱搴︹濅繚瀛樼殑鏄紝瀹為檯鍖歸厤闀垮害-鏈灝忓尮閰嶉暱搴︼紝鎵浠?55瀵瑰簲鐨勫疄闄呭尮閰嶉暱搴︿負258銆?br /><br />鍦ㄨ繘琛屽尮閰嶆椂錛屼細瀵瑰尮閰嶉暱搴﹁繘琛屽垽鏂紝淇濊瘉鍒拌揪鏈澶у尮閰嶉暱搴︽椂錛屽尮閰嶅氨鍋滄銆備篃灝辨槸璇達紝鍗充嬌鏈変袱涓覆鐨勭浉鍚岄儴鍒嗚秴榪囦簡鏈澶у尮閰嶉暱搴︼紝涔熷彧鍖歸厤鍒版渶澶у尮閰嶉暱搴︺?br /><br />淇濆瓨鐩擱殧璺濈鎵鐢ㄧ殑浣嶆暟鍜岀獥鍙eぇ灝忔槸浜掔浉鍐沖畾鐨勶紝緇煎悎涓ゆ柟闈㈠悇縐嶅洜绱狅紝紜畾浜嗙獥鍙eぇ灝忥紝涔熷氨紜畾浜嗕繚瀛樼浉闅旇窛紱繪墍浣跨敤鐨勪綅鏁般?br /><br />2.5 gzip 鐨?LZ77閮ㄥ垎鐨勫疄鐜拌鐐?br /><br />gzip 鐨?LZ77 閮ㄥ垎鐨勫疄鐜頒富瑕佸湪鍑芥暟 defalte() 涓?br /><br />鎵浣跨敤鐨勭紦鍐插尯<br /><br />window[] 鐢ㄦ潵鏀炬枃浠朵腑璇誨叆鐨勫唴瀹廣?br /><br />l_buf[]錛宒_buf[]錛宖lag_buf[] 鐢ㄦ潵鏀綥Z77鍘嬬緝寰楀埌鐨勭粨鏋溿?br />l_buf[] 涓殑姣忎釜瀛楄妭鏄竴涓病鏈夊尮閰嶇殑瀛楄妭錛屾垨鑰呮槸涓涓尮閰嶇殑瀵逛腑鐨勫尮閰嶉暱搴?3銆俵_buf[]鍏辯敤浜唅nbuf[]銆?br />d_buf[] 涓殑姣忎釜unsigned short錛屾槸涓涓尮閰嶇殑瀵逛腑鐨勭浉闅旇窛紱匯?br />flag_buf[] 涓瘡浣嶆槸涓涓爣蹇楋紝鐢ㄦ潵鎸囩ずl_buf[]涓浉搴斿瓧鑺傛槸娌℃湁鍖歸厤鐨勫瓧鑺傦紝榪樻槸涓涓尮閰嶇殑瀵逛腑鐨勫尮閰嶉暱搴?3銆?br /><br />prev[]錛宧ead[] 鐢ㄦ潵瀛樻斁瀛楀吀淇℃伅銆傚疄闄呬笂 head 涓哄畯瀹氫箟 prev+WSIZE銆?br /><br />鍒濆鍖栬繃紼嬩腑錛岃皟鐢?lm_init()銆?br />lm_init() 涓紝浠庤緭鍏ユ枃浠朵腑璇誨叆2涓獥鍙eぇ灝忥紝涔熷氨鏄?4KB鐨勫唴瀹瑰埌window[]涓俵ookahead 涓負榪斿洖鐨勮鍏ュ瓧鑺傛暟銆備嬌鐢╳indow涓殑澶翠袱涓瓧鑺傦紝UPDATE_HASH錛屽垵濮嬪寲ins_h銆?br /><br />deflate() 涓紝涓涓鐞嗗驚鐜腑錛岄鍏?INSERT_STRING 鎶婂綋鍓嶄覆鎻掑叆瀛楀吀錛孖NSERT_STRING 鏄竴涓畯錛屼綔鐢ㄥ氨鏄敤鍝堝笇鍑芥暟璁$畻褰撳墠涓茬殑ins_h錛岀劧鍚庢妸鍘熸潵鐨刪ead[ins_h]涓殑鍐呭錛岄摼鍏ラ摼涓紙鏀懼埌prev涓級錛屽悓鏃舵妸鍘熸潵鐨刪ead [ins_h]淇濆瓨鍦╤ash_head鍙橀噺涓紝鐢ㄦ潵鍚庨潰榪涜鍖歸厤鍒ゆ柇錛岀劧鍚庢妸褰撳墠涓茬殑寮濮嬩綅緗紝淇濆瓨鍦╤ead[ins_h]涓?br /><br />鍒ゆ柇hash_head涓繚瀛樼殑鍐呭涓嶄負絀猴紝璇存槑鍖歸厤閾句笂鏈夊唴瀹廣傝皟鐢?longest_match () 瀵繪壘鍖歸厤閾句笂鐨勬渶闀垮尮閰嶃?br />hash_head涓繚瀛樼殑鍐呭涓虹┖錛岃鏄庡綋鍓嶅瓧鑺傚紑濮嬬殑涓詫紝鍦ㄧ獥鍙d腑娌℃湁鍖歸厤銆?br />鐢變簬浣跨敤浜唋azy match錛屼嬌寰楀垽鏂殑鎯呭喌鏇村鏉傘?br /><br />鍖歸厤涓茬殑杈撳嚭錛屾垨鑰呮槸娌℃湁鍖歸厤鐨勫瓧鑺傜殑杈撳嚭錛岄兘鏄皟鐢ㄥ嚱鏁?ct_tally()銆?br />瀵逛簬鍖歸厤涓詫紝杈撳嚭涔嬪悗錛岃繕闇瑕佷負鍖歸厤涓蹭腑鐨勬瘡涓瓧鑺備嬌鐢?INSERT_STRING錛屾妸鍖歸厤涓蹭腑姣忎釜瀛楄妭寮濮嬬殑涓查兘鎻掑叆鍒板瓧鍏鎬腑銆?br /><br />ct_tally ()涓紝鎶婁紶鍏ョ殑"娌℃湁鍖歸厤鐨勫瓧鑺?鎴栬呮槸"鍖歸厤闀垮害-3"鏀懼埌l_buf[]涓紝鐒跺悗涓轟互鍚庣殑Huffman緙栫爜鍋氱粺璁℃鏁扮殑宸ヤ綔錛屽鏋滀紶鍏ョ殑鏄尮閰嶆儏 鍐碉紝浼犲叆鐨勫弬鏁頒腑浼氭湁鐩擱殧璺濈錛屾妸鐩擱殧璺濈淇濆瓨鍦╠_buf[]涓傛牴鎹紶鍏ョ殑鍙傛暟錛屽彲浠ュ垽鏂槸鍝鎯呭喌錛岀劧鍚庤緗竴涓彉閲忎腑鐩稿簲鐨勬爣蹇椾綅錛屾瘡8涓爣蹇? 浣嶏紝涔熷氨鏄涓涓瓧鑺傦紝灝變繚瀛樺埌flag_buf[]涓傝繕鏈変竴浜涘垽鏂紝鎴戜滑灝嗗湪鍚庨潰榪涜璇存槑銆?br /><br />2.6 鍒嗗潡杈撳嚭<br /><br />LZ77 鍘嬬緝鐨勭粨鏋滄斁鍦紝l_buf[]錛宒_buf[]錛宖lag_buf[] 涓?br />瀵逛簬 LZ77 鐨勫帇緙╃粨鏋滐紝鍙兘浣跨敤涓鍧楄緭鍑烘垨鑰呭垎鎴愬鍧楄緭鍑猴紙LZ77鍘嬬緝涓瀹氱殑閮ㄥ垎涔嬪悗錛屽氨榪涜涓嬈″潡杈撳嚭錛岃緭鍑轟竴鍧楋級銆傚潡鐨勫ぇ灝忎笉鍥哄畾銆?br /><br />杈撳嚭鐨勬椂鍊欙紝浼氬LZ77鐨勫帇緙╃粨鏋滐紝榪涜Huffman緙栫爜錛屾渶緇堟妸Huffman緙栫爜鐨勭粨鏋滆緭鍑哄埌outbuf[]緙撳啿鍖轟腑銆?br />榪涜Huffman緙栫爜錛屽茍杈撳嚭鐨勫伐浣滐紝鍦?flush_block() 涓繘琛屻?br /><br />鍦╟t_tally()涓繘琛屽垽鏂紝濡傛灉婊¤凍涓浜涙潯浠剁殑璇濓紝褰撲粠ct_tally()涓繑鍥炰箣鍚庯紝灝變細瀵圭幇鏈夌殑LZ77鐨勭粨鏋滐紝榪涜Huffman緙栫爜錛岃緭鍑哄埌涓涓潡涓?br />鍦ㄦ暣涓枃浠跺鐞嗙粨鏉燂紝deflate()鍑芥暟瑕佺粨鏉熺殑鏃跺欙紝浼氭妸LZ77鐨勭粨鏋滐紝榪涜Huffman緙栫爜錛岃緭鍑哄埌涓涓潡涓?br /><br />鍦╟t_tally()涓紝姣忓綋l_buf[]涓殑瀛楄妭鏁幫紙姣忎釜瀛楄妭鏄竴涓病鏈夊尮閰嶇殑瀛楄妭鎴栬呬竴涓尮閰嶉暱搴︼級澧炲姞0x1000錛屼篃灝辨槸4096鐨勬椂鍊欍傚皢浼扮畻鍘嬬緝鐨勬儏鍐碉紝浠ュ垽鏂幇鍦ㄧ粨鏉熻繖涓潡鏄惁姣旇緝濂斤紝濡傛灉瑙夊緱姣旇緝濂斤紝灝辮緭鍑轟竴涓潡銆傚鏋滆寰椾笉濂斤紝灝卞厛涓嶈緭鍑恒?br /><br />鑰屽綋l_buf[]婊′簡鐨勬椂鍊欙紝鎴栬卍_buf[]婊′簡鐨勬椂鍊欙紝灝嗚偗瀹氬鐜版湁鐨凩Z77鍘嬬緝鐨勭粨鏋滐紝榪涜Huffman緙栫爜錛岃緭鍑哄埌涓涓潡涓?br /><br />鍐? 瀹氳緭鍑轟竴鍧楃殑璇濓紝浼氬彧閽堝榪欎竴鍧楃殑鍐呭錛屽緩绔婬uffman鏍戯紝榪欎竴鍧楀唴瀹瑰皢浼氳榪涜Huffman緙栫爜鍘嬬緝錛屽茍琚緭鍑哄埌outbuf[]涓傚鏋滄槸鍔ㄦ? Huffman緙栫爜錛屾爲鐨勪俊鎭篃琚緭鍑哄埌outbuf[]涓傝緭鍑轟箣鍚庯紝浼氳皟鐢╥nit_block()錛屽垵濮嬪寲涓涓柊鍧楋紝閲嶆柊鍒濆鍖栦竴浜涘彉閲忥紝鍖呮嫭鍔ㄦ? 鏍戠殑緇撶偣琚疆0錛屼篃灝辨槸璇達紝灝嗕負鏂板潡灝嗘潵鐨凥uffman鏍戦噸鏂板紑濮嬬粺璁′俊鎭?br /><br />杈撳嚭鍧楃殑澶у皬鏄笉鍥哄畾鐨勶紝棣栧厛鍦ㄨ繘琛孒uffman緙栫爜涔嬪墠錛岃杈撳嚭鐨勫唴瀹圭殑澶у皬灝辨槸涓嶅浐瀹氾紝瑕佺湅鎯呭喌錛岃繘琛孒uffman緙栫爜涔嬪悗錛屽氨鏇翠笉鍥哄畾浜嗐?br />鍧楃殑澶у皬涓嶅浐瀹氾紝閭d箞瑙e帇緙╃殑鏃跺欙紝濡備綍鍖哄垎鍧楀憿銆傜紪鐮佹爲涓湁涓涓〃紺哄潡緇撴潫鐨勭粨鐐癸紝EOB錛屽湪姣忔杈撳嚭鍧楃殑鏈鍚庯紝杈撳嚭榪欎釜緇撶偣鐨勭紪鐮侊紝鎵浠ヨВ鍘嬬緝鐨勬椂鍊欙紝褰撻亣鍒頒簡榪欎釜緇撶偣灝辮〃鏄庝竴涓潡緇撴潫浜嗐?br /><br />姣忎釜鍧楁渶寮濮嬬殑2浣嶏紝鐢ㄦ潵鎸囨槑鏈潡浣跨敤鐨勬槸鍝緙栫爜鏂瑰紡錛?0琛ㄧず鐩存帴瀛樺偍錛?1琛ㄧず闈欐丠uffman緙栫爜錛?0琛ㄧず鍔ㄦ丠uffman緙栫爜銆傛帴涓嬫潵鐨?浣嶏紝鎸囨槑鏈潡鏄惁鏄渶鍚庝竴鍧楋紝0琛ㄧず涓嶆槸錛?琛ㄧず鏄渶鍚庝竴鍧椼?br /><br />杈撳嚭涓涓潡錛屽鐜板湪瀛楀吀涓殑鍐呭娌℃湁褰卞搷錛屼笅涓涓潡錛屼粛灝嗙敤涔嬪墠褰㈡垚鐨勫瓧鍏革紝榪涜鍖歸厤銆?br /><br /><br />2.7 闈欐丠uffman緙栫爜涓庡姩鎬丠uffman緙栫爜<br /><br />闈欐丠uffman緙栫爜灝辨槸浣跨敤gzip鑷繁棰勫厛瀹氫箟濂戒簡涓濂楃紪鐮佽繘琛屽帇緙╋紝瑙e帇緙╃殑鏃跺欎篃浣跨敤榪欏緙栫爜錛岃繖鏍蜂笉闇瑕佷紶閫掔敤鏉ョ敓鎴愭爲鐨勪俊鎭?br />鍔ㄦ丠uffman緙栫爜灝辨槸浣跨敤緇熻濂界殑鍚勪釜絎﹀彿鐨勫嚭鐜版鏁幫紝寤虹珛Huffman鏍戯紝浜х敓鍚勪釜絎﹀彿鐨凥uffman緙栫爜錛岀敤榪欎駭鐢熺殑Huffman緙栫爜榪涜鍘嬬緝錛岃繖鏍烽渶瑕佷紶閫掔敓鎴愭爲鐨勪俊鎭?br /><br />gzip 鍦ㄤ負涓鍧楄繘琛孒uffman緙栫爜涔嬪墠錛屼細鍚屾椂寤虹珛闈欐丠uffman鏍戯紝鍜屽姩鎬丠uffman鏍戯紝鐒跺悗鏍規嵁瑕佽緭鍑虹殑鍐呭鍜岀敓鎴愮殑Huffman鏍戯紝璁$畻浣? 鐢ㄩ潤鎬丠uffman鏍戠紪鐮侊紝鐢熸垚鐨勫潡鐨勫ぇ灝忥紝浠ュ強璁$畻浣跨敤鍔ㄦ丠uffman鏍戠紪鐮侊紝鐢熸垚鍧楃殑澶у皬銆傜劧鍚庤繘琛屾瘮杈冿紝浣跨敤鐢熸垚鍧楄緝灝忕殑鏂規硶榪涜 Huffman緙栫爜銆?br /><br />瀵逛簬闈欐佹爲鏉ヨ錛屼笉闇瑕佷紶閫掔敤鏉ョ敓鎴愭爲鐨勯偅閮ㄥ垎淇℃伅銆傚姩鎬佹爲闇瑕佷紶閫掕繖涓俊鎭傝屽綋鏂囦歡姣旇緝灝忕殑鏃跺欙紝浼犻掔敓鎴愭爲鐨勪俊鎭緱涓嶅伩澶憋紝鍙嶈屼細浣垮帇緙╂枃浠跺彉澶с備篃灝辨槸璇村浜庢枃浠舵瘮杈冨皬鐨勬椂鍊欙紝灝卞彲鑳戒細鍑虹幇浣跨敤闈欐丠uffman緙栫爜姣斾嬌鐢ㄥ姩鎬丠uffman緙栫爜錛岀敓鎴愮殑鍧楀皬銆?br /><br />2.8 緙栫爜鐨勪駭鐢?br /><br />deflate 綆楁硶鍦℉uffman鏍戠殑鍩虹涓婏紝鍙堝姞鍏ヤ簡鍑犳潯瑙勫垯錛屾垜浠妸榪欐牱鐨勬爲縐頒綔deflate鏍戯紝浣垮緱鍙鐭ラ亾鎵鏈変綅闀夸笂鐨勭粨鐐圭殑涓暟錛屽氨鍙互寰楀埌鎵鏈夌粨鐐圭殑緙? 鐮併傝繖鏍峰仛鐨勫師鍥犳槸錛屽噺灝戦渶瑕佸瓨鏀懼湪鍘嬬緝鍘嬬緝鏂囦歡涓殑鐢ㄦ潵鐢熸垚鏍戠殑淇℃伅銆傝鎯沖紕鏄庣櫧錛宒eflate濡備綍鐢熸垚Huffman緙栫爜錛屼竴瀹氳寮勬槑鐧戒竴浜? Huffman鏍戯紝鍜宒eflate鏍戠殑鎬ц川錛屼笅闈㈠唴瀹規槸瀵笻uffman鏍戝拰deflate鏍戝仛浜嗕簺綆鍗曠爺絀跺緱鍒扮殑銆?br /><br />Huffman鏍戠殑鎬ц川<br /><br />1 鍙跺瓙緇撶偣涓簄鐨勮瘽錛岄偅涔堟暣棰楁爲鐨勬葷粨鐐逛負 2n-1銆?br />綆鍗曡瘉鏄庤鏄庯紝鍏堣瘉錛屾渶灝忕殑鏍戯紝涔熷氨鏄彧鏈変笁涓粨鐐癸紝涓涓牴鑺傜偣錛屼袱涓彾瀛愯妭鐐圭殑鏍戠鍚堛傜劧鍚庡湪浠諱綍絎﹀悎鐨勬爲涓婂仛鏈灝忕殑娣誨姞寰楀埌鐨勬爲涔熺鍚堛傛墍浠ラ兘絎﹀悎銆?br /><br />2 鏈宸﹁竟鐨勫彾瀛愮粨鐐圭殑緙栫爜涓?錛屼絾鏄綅闀夸笉涓瀹氥?br /><br />deflate涓鍔犱簡闄勫姞鏉′歡鐨刪uffman鏍戠殑鎬ц川<br /><br />1 鍚屾牱浣嶉暱鐨勫彾瀛愮粨鐐圭殑緙栫爜鍊間負榪炵畫鐨勶紝鍙抽潰鐨勬繪瘮宸﹂潰鐨勫ぇ1銆?br /><br />2 (n+1)浣嶉暱鏈宸﹂潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶灝忕殑鍙跺瓙緇撶偣錛夌殑鍊間負n浣嶉暱鏈鍙抽潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶澶х殑鍙跺瓙緇撶偣錛夌殑鍊?1錛岀劧鍚庡彉闀夸竴浣嶏紙涔熷氨鏄乏縐?浣嶏級銆?br /><br />3 n浣嶉暱鐨勫彾瀛愮粨鐐癸紝鏈鍙抽潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶澶х殑鍙跺瓙緇撶偣錛夌殑鍊間負鏈宸﹂潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶灝忕殑鍙跺瓙緇撶偣錛夌殑鍊?鍔犱笂 n浣嶉暱鐨勫彾瀛愮粨鐐圭殑涓暟 鍑?1銆?br /><br />4 (n+1)浣嶉暱鏈宸﹂潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶灝忕殑鍙跺瓙緇撶偣錛夌殑鍊?涓?n浣嶉暱鏈宸﹂潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶灝忕殑鍙跺瓙緇撶偣錛夌殑鍊?鍔犱笂 n浣嶉暱鐨勫彾瀛愮粨鐐圭殑涓暟錛岀劧鍚庡彉闀夸竴浣嶏紙涔熷氨鏄乏縐?浣嶏級銆?br /><br />榪樻湁涓浜涙爲鐨勬ц川錛屾瘮濡傦紝鏍戠殑鏌愪竴娣卞害涓婃渶澶у彲鑳界紪鐮佹暟銆?br /><br />浠庢墍鏈夌紪鐮佺殑浣嶉暱錛屽緱鍒版墍鏈夌紪鐮佺殑緙栫爜錛?br />緇熻姣忎釜浣嶉暱涓婄殑緙栫爜涓暟鏀懼湪bl_count[]涓?br />鏍規嵁 bl_count[] 涓殑鍊鹼紝璁$畻鍑烘瘡涓綅闀夸笂鐨勬渶灝忕紪鐮佸鹼紝鏀懼湪 next_code[] 涓?br />璁$畻鏂規硶涓猴紝code = (code + bl_count[bits-1]) << 1;<br />鐞嗙敱鏄痙eflate浜屽弶鏍戠殑鎬ц川錛?n+1)浣嶉暱鏈宸﹂潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶灝忕殑鍙跺瓙緇撶偣錛夌殑鍊?涓?n浣嶉暱鏈宸﹂潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶灝忕殑鍙跺瓙緇撶偣錛夌殑鍊?鍔犱笂 n浣嶉暱鐨勫彾瀛愮粨鐐圭殑涓暟錛岀劧鍚庡彉闀夸竴浣嶏紙涔熷氨鏄乏縐?浣嶏級銆?br /><br />鐒跺悗鎸夌収浠g爜鍊肩殑欏哄簭錛屼負鎵鏈夌殑浠g爜緙栫爜銆?br />緙栫爜鏂規硶涓猴紝鏌愪竴浣嶉暱瀵瑰簲鐨刵ext_code[n]錛屾渶寮濮嬫槸榪欎釜浣嶉暱涓婃渶宸﹁竟鐨勫彾瀛愮粨鐐圭殑緙栫爜錛岀劧鍚?+錛屽氨鏄笅涓涓浣嶉暱涓婁笅涓涓彾瀛愮粨鐐圭殑緙栫爜錛屼緷嬈$被鎺紝鐩村埌鎶婅繖涓綅闀夸笂鐨勫彾瀛愮粨鐐圭紪鐮佸畬銆傚疄闄呬笂鐨勭紪鐮佷負bi_reverse(next_code[])銆?br />榪欐牱緙栫爜鐨勭悊鐢辨槸錛宒eflate浜屽弶鏍戠殑鎬ц川銆?br /><br />2.9 5媯墊爲<br /><br />涓鍏辨湁5媯墊爲 static_ltree[]錛宻tatic_dtree[]錛宒yn_ltree[]錛宒yn_dtree[]錛宐l_tree[]銆?br /><br />瀵逛簬鎵鏈夌殑鏍戯紝涓涓彾瀛愮粨鐐硅〃紺虹殑絎﹀彿鐨勫間負n鐨勮瘽錛岄偅涔堣繖涓鍙峰搴旂殑鍙跺瓙緇撶偣鏀懼湪 tree[n] 涓紝<br />姣斿 static_ltree 鐨勫彾瀛愮粨鐐?a' 鐨勫間負鍗佽繘鍒?7錛岄偅涔?a'鐨勫彾瀛愮粨鐐瑰氨鏀懼湪 static_ltree[97] 銆?br /><br />static_ltree[] 闈欐丠uffman緙栫爜鏃訛紝鐢ㄦ潵瀵規病鏈夋敼鍔ㄧ殑瀛楄妭鍜屽尮閰嶉暱搴﹁繘琛岀紪鐮佺殑鏍戙?br />static_dtree[] 闈欐丠uffman緙栫爜鏃訛紝鐢ㄦ潵瀵圭浉闅旇窛紱昏繘琛岀紪鐮佺殑鏍戙?br />dyn_ltree[] 鍔ㄦ丠uffman緙栫爜鏃訛紝鐢ㄦ潵瀵規病鏈夋敼鍔ㄧ殑瀛楄妭鍜屽尮閰嶉暱搴﹁繘琛岀紪鐮佺殑鏍戙?br />dyn_dtree[] 鍔ㄦ丠uffman緙栫爜鏃訛紝鐢ㄦ潵瀵圭浉闅旇窛紱昏繘琛岀紪鐮佺殑鏍戙?br />bl_tree[] 鍔ㄦ丠uffman緙栫爜鏃訛紝鐢ㄦ潵瀵硅В鍘嬬緝鏃剁敤鏉ヤ駭鐢焏yn_ltree[]鍜宒yn_dtree[]鐨勪俊鎭繘琛岀紪鐮佺殑鏍戙?br /><br />闈欐佹爲鍦ㄥ垵濮嬪寲鐨勬椂鍊欙紝涓烘瘡涓彾瀛愮粨鐐圭洿鎺ヤ駭鐢熺紪鐮併?br />鍔ㄦ佹爲錛屾瘡嬈¤杈撳嚭涓鍧楃殑鍐呭錛屽氨鏍規嵁榪欎竴鍧楃殑鍐呭錛岀敓鎴愬姩鎬佹爲錛屽啀鏍規嵁鐢熸垚鐨勫姩鎬佹爲錛屼負姣忎釜鍙跺瓙緇撶偣浜х敓緙栫爜銆?br /><br />姣忔瑕佽緭鍑轟竴鍧楃殑鍐呭鏃訛紝浼氳綆楃敤闈欐佹爲緙栫爜寰楀埌鐨勫潡鐨勫ぇ灝忥紝鍜岀敤鍔ㄦ佹爲緙栫爜寰楀埌鐨勫潡鐨勫ぇ灝忥紝鐒跺悗璋佷駭鐢熺殑鍧楀皬灝辯敤璋併?br /><br />鐢ㄩ潤鎬佺紪鐮佺殑璇濓紝灝變嬌鐢?static_ltree[]錛宻tatic_dtree[]錛屾潵榪涜緙栫爜杈撳嚭銆?br />鐢ㄥ姩鎬佺紪鐮佺殑璇濓紝灝變嬌鐢?dyn_ltree[]錛宒yn_dtree[]錛宐l_tree[] 鏉ヨ繘琛岀紪鐮佽緭鍑恒?br /><br />2.10 鍙跺瓙緇撶偣<br /><br />ltree 錛堢敤鏉ュ娌℃湁鏀瑰姩鐨勫瓧鑺傚拰鍖歸厤闀垮害榪涜緙栫爜鐨勬爲錛岄潤鎬侊紝鍔ㄦ侀兘涓鏍鳳級鐨勫彾瀛愮粨鐐?br />涓鍏?L_CODES 涓紝涔熷氨鏄?86涓?br />0-255 256涓彾瀛愮粨鐐癸紝鏄瓧鑺傜殑256涓?br />256 1涓彾瀛愮粨鐐癸紝鏄?END_BLOCK錛岀敤鏉ヨ〃紺哄潡緇撴潫鐨勫彾瀛愮粨鐐廣?br />257-285 29涓彾瀛愮粨鐐癸紝鏄〃紺哄尮閰嶉暱搴︾殑29涓寖鍥淬?br /><br />dtree 錛堢敤鏉ュ鐩擱殧璺濈榪涜緙栫爜鐨勬爲錛岄潤鎬侊紝鍔ㄦ侀兘涓鏍鳳級鐨勫彾瀛愮粨鐐?br />涓鍏?D_CODES 涓紝涔熷氨鏄?0涓?br />0-29 30涓彾瀛愮粨鐐癸紝鏄〃紺虹浉闅旇窛紱葷殑30涓寖鍥淬?br /><br />bl_tree 鐨勫彾瀛愮粨鐐?br />涓鍏?BL_CODES 涓紝涔熷氨鏄?9涓?br />0-15 琛ㄧず緙栫爜浣嶉暱涓?0-15銆?br />16 澶嶅埗涔嬪墠鐨勭紪鐮侀暱搴?-6嬈°備箣鍚庣殑涓や綅鎸囨槑閲嶅嬈℃暟銆?br />17 閲嶅緙栫爜浣嶉暱涓?鐨勶紝3-10嬈★紝涔嬪悗鐨?浣嶆寚鏄庨噸澶嶆鏁般?br />18 閲嶅緙栫爜浣嶉暱涓?鐨勶紝11-138嬈★紝涔嬪悗鐨?浣嶆寚鏄庨噸澶嶆鏁般?br /><br />2.11 闈欐丠uffman緙栫爜<br /><br />鍒濆鍖朾ase_length[],length_code[],base_dist[],dist_code[]銆?br /><br />base_length[]涓猴紝29涓?鍖歸厤闀垮害 鑼冨洿鐨勶紝姣忎釜鑼冨洿寮濮嬬殑闀垮害鍊箋?br />length_code[]涓猴紝256 涓彲鑳界殑鍖歸厤闀垮害 鎵灞炵殑鑼冨洿銆?br />姣斿錛宐ase_length[9]=0xa錛岃〃紺虹9涓寖鍥寸殑寮濮嬪間負0xa銆?br />length_code[11]=9,琛ㄧず鍖歸厤闀垮害涓?1鐨勫尮閰嶉暱搴︼紝灞炰簬絎?涓寖鍥淬?br /><br />base_dist[],30涓?鍖歸厤璺濈 鑼冨洿鐨勶紝姣忎釜鑼冨洿鐨勫紑濮嬬殑鍊鹼紝灝辨槸姣忎釜鑼冨洿鍐呮渶灝忕殑鍊箋?br />dist_code[],榪欎釜鏈夌偣鐗規畩錛屼竴鍏辨湁32K涓彇鍊鹼紝榪欓噷鎶婅繖32K縐嶅鹼紝鍒嗘垚浜嗕袱澶х被錛?br />0-255榪?56涓間負涓綾伙紝榪欐椂浠栦滑鐩存帴涓篸ist_code[]鐨勭儲寮曘?br />256-32K涓轟竴綾伙紝榪欐椂浠栦滑鐨勫幓鎺変綆7浣嶏紝鍜屾渶楂樹綅錛屽墿涓嬬殑8浣嶄負绱㈠紩錛?浣嶅垰濂界儲寮?56欏廣傝兘榪欎箞鍋氱殑鍘熷洜鏄紝棣栧厛鏈澶?2K鐨勮窛紱繪渶澶ч渶瑕?5浣嶏紝鎵浠?6浣嶇殑鏈楂樹綅鎬諱笉浼氱敤錛屽叾嬈″墿涓嬭繖浜涜寖鍥寸殑杈圭晫鑷沖皯閮戒負浜岃繘鍒? 000 0000 鐨勬暣鏁板嶃?br />姣斿 鍖歸厤璺濈涓?10,灝忎簬256錛屾墍浠ュ畠灞炰簬綾?dist_code[10]=6錛岀6綾匯?br />鍖? 閰嶈窛紱諱負 10K 錛屽ぇ浜?56錛屾墍浠ュ畠灞炰簬綾? dist_code[256+10K>>7]=dist_code[256+10240>>7]=dist_code[256+80] =dist_code[336]=0x1a=26錛屽睘浜?6綾伙紝26綾葷殑鑼冨洿涓?193-12288錛?0240灝辨槸鍦ㄨ繖涓寖鍥村唴銆?br /><br />鎸囧畾浜嗘瘡涓猯iteral鐨勪綅闀褲傦紙涓鍏卞皢鏈?88涓猯iteral銆傚寘鎷?56涓瓧鑺傚?1涓狤OB+29涓尮閰嶉暱搴﹁寖鍥?286涓傚2涓槸涓轟簡婊℃爲銆傦級騫剁粺璁℃瘡涓綅闀夸笂鐨刲iteral涓暟鏀懼湪bl_count[]涓?br /><br />鏍規嵁 bl_count[] 涓殑鍊鹼紝璁$畻鍑烘瘡涓綅闀夸笂鐨勬渶灝忕紪鐮佸鹼紝鏀懼湪 next_code[] 涓?br />璁$畻鏂規硶涓猴紝code = (code + bl_count[bits-1]) << 1;<br />鐞嗙敱鏄痙eflate浜屽弶鏍戠殑鎬ц川錛?n+1)浣嶉暱鏈宸﹂潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶灝忕殑鍙跺瓙緇撶偣錛夌殑鍊?涓?n浣嶉暱鏈宸﹂潰鐨勫彾瀛愮粨鐐癸紙涔熷氨鏄紪鐮佸兼渶灝忕殑鍙跺瓙緇撶偣錛夌殑鍊?鍔犱笂 n浣嶉暱鐨勫彾瀛愮粨鐐圭殑涓暟錛岀劧鍚庡彉闀夸竴浣嶏紙涔熷氨鏄乏縐?浣嶏級銆?br /><br />鐒跺悗浠巐iteral鍊肩殑0錛屽埌literal鍊肩殑鏈澶с備負姣忎釜literal緙栫爜銆?br />緙栫爜鏂規硶涓猴紝鏌愪竴浣嶉暱瀵瑰簲鐨刵ext_code[n]錛屾渶寮濮嬫槸榪欎釜浣嶉暱涓婃渶宸﹁竟鐨勫彾瀛愮粨鐐圭殑緙栫爜錛岀劧鍚?+錛屽氨鏄笅涓涓浣嶉暱涓婁笅涓涓彾瀛愮粨鐐圭殑緙栫爜錛屼緷嬈$被鎺紝鐩村埌鎶婅繖涓綅闀夸笂鐨勫彾瀛愮粨鐐圭紪鐮佸畬銆?br />瀹為檯涓婄殑緙栫爜涓篵i_reverse(next_code[])銆?br />姣斿<br />tree[n].Code = bi_reverse(next_code[len]++, len);<br /><br />姝ゆ椂 next_code[len] 鍊間負 浜岃繘鍒?00110000 鍗?x30<br />tree[n].Code 鏈鍚庤璧嬪間負 浜岃繘鍒?00001100 鍗?x0c<br /><br />榪欐牱鎴戜滑灝卞緱鍒頒簡 static_ltree[]錛屽畠浠iteral鐨勫間負绱㈠紩錛屽瓨鏀劇潃literal瀵瑰簲鐨勭紪鐮併?br />姣斿 'a' 鐨勫間負鍗佽繘鍒?7錛?static_ltree[97].code=0x0089 static_ltree[97].len=8銆?br />璇存槑a鐨勭紪鐮佷負浜岃繘鍒?10001001銆?br /><br />涓簊tatic_dtree 緙栫爜銆傝繖涓紪鐮佸緢綆鍗曪紝鐢變簬鎵鏈夌粨鐐歸兘鏄?浣嶉暱鐨勶紙鎸囧畾鐨勶級錛屾墍浠ユ牴鎹甦eflate浜屽弶鏍戞ц川錛屾渶宸﹁竟鐨勫彾瀛愯妭鐐圭紪鐮佷負0錛屼箣鍚庢瘡嬈″姞1鍗沖彲錛岀洿鍒扮紪瀹? 鎵鏈夊彾瀛愮粨鐐廣傛敞鎰忚繖閲屼篃瑕乥i_reverse()涓涓嬨備篃灝辨槸璇達紝緙栫爜涓?浠庢爲鏍瑰紑濮嬪埌涓涓彾瀛愮粨鐐圭殑璺緞瀵瑰簲鐨勪綅嫻?鐨勯嗕綅嫻併?br /><br />鐢℉uffman緙栫爜瀵筁Z77澶勭悊緇撴灉榪涜緙栫爜杈撳嚭銆?br /><br />榪欐椂錛?br />l_buf[]涓瘡涓瓧鑺備負literal鎴栬?鍖歸厤闀垮害-MIN_MATCH銆?br />d_buf[]涓哄尮閰嶈窛紱伙紝姣忛」涓?6浣嶃?br />flag_buf[]涓瘡浣嶄負鎸囩ずinbuf[]涓搴斿瓧鑺備負literal榪樻槸 鍖歸厤闀垮害-MIN_MATCH 鐨勬爣蹇楋紝姣斿<br />flag_buf絎琲浣嶄負1錛岃鏄巌nbuf[i]涓哄尮閰嶉暱搴?MIN_MATCH銆?br /><br />璇誨嚭flag_buf涓殑姣忎竴浣嶏紝榪涜鍒ゆ柇銆?br />濡傛灉涓?錛岃〃紺哄搴旂殑l_buf涓殑閭d釜瀛楄妭涓簂iteral銆?br />濡傛灉涓?錛岃〃紺哄搴旂殑l_buf涓殑閭d釜瀛楄妭涓哄尮閰嶉暱搴?MIN_MATCH銆?br /><br />瀵逛簬literal錛屽氨鐢╨_buf[]鐨勮繖涓煎仛绱㈠紩錛屽湪static_ltree涓緱鍒扮紪鐮侊紝鍜岀紪鐮侀暱搴︼紝鐒跺悗杈撳嚭榪欎釜緙栫爜銆?br /><br />瀵? 浜? 鍖歸厤闀垮害-MIN_MATCH錛屽氨鐢╨_buf[]鐨勮繖涓煎仛绱㈠紩錛屽湪length_code[]涓鍏堝緱鍒拌繖涓尮閰嶉暱搴︽墍鍦ㄧ殑鑼冨洿錛屼竴鍏辨湁29涓寖鍥淬? 涔熷氨鏄 鍖歸厤闀垮害-MIN_MATCH 鍙栧艱寖鍥翠負 (3..258)錛屼竴鍏辨湁256縐嶅彲鑳界殑鍊箋傝繖256縐嶅彲鑳藉鹼紝琚垎閰嶅湪浜?9涓寖鍥翠腑銆?br /><br />鎴戜滑鐢╨_buf[]鐨勮繖涓煎仛绱㈠紩錛屽湪length_code[]涓緱鍒拌繖涓尮閰嶉暱搴︽墍鍦ㄧ殑鑼冨洿銆?br /><br />鐒跺悗鐢?鑼冨洿鍊?256+1 寰楀埌璇ヨ寖鍥存墍瀵瑰簲鐨?literal銆傜敤榪欎釜literal鍋氱儲寮曪紝鍦╯tatic_ltree涓緱鍒扮紪鐮侊紝鍜岀紪鐮侀暱搴︼紝鐒跺悗杈撳嚭榪欎釜緙栫爜銆?br /><br />鐒跺悗鐢?鑼冨洿鍊?鍋氱儲寮曪紝鍦?extra_lbits[] 涓緱鍒拌鑼冨洿鐨勯檮鍔犱綅鐨勪綅鏁幫紝濡傛灉闄勫姞浣嶄綅鏁頒笉涓?錛?br />灝辮緭鍑洪檮鍔犱綅銆傞檮鍔犱綅涓?inbuf[]涓殑閭d釜鍊鹼紝灝辨槸 鍖歸厤闀垮害-MIN_MATCH 鍑忓幓 榪欎釜鑼冨洿鐨勫搴旂殑 base_length[]銆?br /><br />鐒跺悗浠巇_buf[]涓彇鍑猴紝鍖歸厤璺濈銆?br />褰撳尮閰嶈窛紱誨皬浜?56鏃訛紝鐢ㄥ尮閰嶈窛紱誨仛绱㈠紩錛屽湪dist_code涓彇鍑哄搴旂殑鑼冨洿鍊箋?br />褰撳尮閰嶈窛紱諱笉灝忎簬256鏃訛紝鐢ㄥ尮閰嶈窛紱誨彸縐?浣嶏紝涔熷氨鏄敤楂?浣嶏紝鍋氱儲寮曪紝鍦╠ist_code+256涓彇鍑哄搴旂殑鑼冨洿鍊箋?br /><br />瀵瑰尮閰嶈窛紱伙紝鍖歸厤璺濈鐨勫彇鍊艱寖鍥翠負錛?1..32,768)錛屼竴鍏辨湁32k縐嶅彲鑳界殑鍊箋?br />鍒嗘垚浜?0涓寖鍥淬傜敱浜庡尮閰嶈窛紱葷殑鍙栧艱寖鍥翠負錛?1..32,768)錛屾墍浠ュ尮閰嶈窛紱諱嬌鐢?5浣嶃?br /><br />鐒跺悗鐢ㄨ窛紱葷殑鑼冨洿鍊煎仛绱㈠紩錛屽湪static_dtree[] 涓緱鍒扮紪鐮侊紝鍜岀紪鐮侀暱搴︺傜劧鍚庤緭鍑鴻繖涓紪鐮併?br />鐒跺悗鐢ㄨ窛紱葷殑鑼冨洿鍊煎仛绱㈠紩錛屽湪extra_dbits[] 涓緱鍒拌鑼冨洿鐨勯檮鍔犱綅鐨勪綅鏁幫紝濡傛灉闄勫姞浣嶄綅鏁頒笉涓?錛?br />灝辮緭鍑洪檮鍔犱綅銆傝緭鍑虹殑闄勫姞浣嶄負 dist-base_dist[code]銆?br /><br />姣斿錛屽彇鍑轟竴涓猟ist涓?0銆俤ist_code[10]=6錛岃鏄庡睘浜庣6涓寖鍥淬?br />鐒跺悗鏌?extra_dbits,extra_dbits[6]=2錛岃鏄庢湁涓や釜extra bits銆?br />local int near extra_dbits[D_CODES] /* extra bits for each distance code */<br />= {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};<br />棣栧厛杈撳嚭 static_dtree[6].len浣嶇殑浣嶆祦錛宻tatic_dree[6].code銆傦紙static_dtree鐨勪綅闀塊兘涓?錛?br />鐒跺悗杈撳嚭 extra_dbits[6]浣嶇殑浣嶆祦錛?0-base_dist[6]=10-8=2=浜岃繘鍒剁殑10銆?br /><br />鍙戦佸畬inbuf涓殑姣忎釜瀛楄妭涔嬪悗錛屾渶鍚庡彂閫?END_BLOCK 鐨勭紪鐮併?br /><br />2.12 鍔ㄦ丠uffman緙栫爜<br /><br />紜畾鎵鏈塴iteral錛屽尮閰嶉暱搴﹁寖鍥達紝鍜屽尮閰嶈窛紱昏寖鍥寸殑鍑虹幇嬈℃暟銆?br />鍦ㄨ繘琛孡Z77鍘嬬緝鐨勮繃紼嬩腑錛屾瘡紜畾涓涓猯iteral鎴栬呭尮閰嶏紝閮戒細璋冪敤 ct_tally()銆?br />鍦?ct_tally() 涓紝濡傛灉鏄竴涓猯iteral錛屽氨 dyn_ltree[lc].Freq++銆?br />濡傛灉鏄竴涓尮閰嶏紝灝?dyn_ltree[length_code[lc]+LITERALS+1].Freq++錛宒yn_dtree[d_code(dist)].Freq++銆?br /><br />璋冪敤 build_tree() 寤虹珛 literal鍜屽尮閰嶉暱搴﹁寖鍥達紙涔熷氨鏄痙yn_ltree鐨勫彾瀛愮粨鐐癸紝鍏?86涓級 鐨勬爲錛屽茍涓轟粬浠紙literal鍜屽尮閰嶉暱搴﹁寖鍥達級緙栫爜銆?br />鐢熸垚鏍戜腑錛宧eap[]鏄敤鏉ヨ緟鍔╃敓鎴愭爲鐨勭紦鍐插尯銆?br /><br />棣栧厛鎶妕ree[]涓墍鏈夊嚭鐜版鏁頒笉涓?鐨勫鹼紙涔熷氨鏄儲寮曪紝姣斿tree[0x61]灝變負'a'鐨勫搴旈」錛夛紝鏀懼埌heap[]涓?br /><br />tree[] 鐨勫厓绱犱釜鏁頒負 2*L_CODES+1錛孡_CODES涓哄彾瀛愮粨鐐圭殑涓暟錛?86銆?br />鐢盚uffman浜屽弶鏍戞ц川錛屽彾瀛愮粨鐐逛負n,閭d箞榪欐5鏍戠殑鎬葷粨鐐逛負2n-1銆?br /><br />tree[] 灝嗙敤鏉ヤ繚瀛樼敓鎴愮殑鏍戙倀ree[]鐨勫墠L_CODES 欏癸紝鐢ㄦ潵瀛樻斁鍙跺瓙緇撶偣銆傛瘮濡?a'鐨勭粨鐐逛俊鎭紝鏀懼湪tree[0x61]涓侺_CODES 涔嬪悗鐨勯」鐢ㄦ潵鏀句腑闂寸粨鐐廣?br /><br />heap[] 灝嗙敤鏉ユ斁鐢熸垚鏍戠殑榪囩▼涓駭鐢熺殑涓存椂鍐呭銆俬eap[]鐨勫ぇ灝忎篃涓?2*L_CODES+1 銆傚畠鐨勫墠 L_CODES 鐢ㄦ潵鏀?br />鐢熸垚鏍戣繃紼嬩腑鐨勭粨鐐癸紝鏈寮濮嬫槸鍙跺瓙緇撶偣錛岄殢鐫鐢熸垚鏍戠殑榪涜錛屼袱涓彾瀛愮粨鐐硅寮勬帀錛屾斁鍏ヤ粬浠殑涓棿緇撶偣銆傚悗 L_CODES 錛屼粠鍚庡悜鍓嶇敤銆傚湪鐢熸垚鏍戠殑榪囩▼涓紝鎵鏈夌粨鐐癸紙鏍癸紝涓棿錛屽彾瀛愶級閮藉皢鎸夋潈鍊煎ぇ灝忛『搴忔斁鍦ㄨ繖閲屻?br />灝嗘潵鐢熸垚浣嶉暱鏃訛紝闇瑕佷嬌鐢ㄣ?br /><br />pqdownheap(tree, SMALLEST); 鐨勪綔鐢ㄥ氨鏄皢heap涓殑緇撶偣涓紝鎵懼嚭freq鏈灝忕殑閭d釜錛屾斁鍦╤eap[1]涓?br /><br />鐢熸垚鏍戠殑榪囩▼涓猴紝姣忔浠巋eap涓壘鍑轟袱涓渶灝忕殑緇撶偣錛岀劧鍚庣粰浠栦滑寮勪竴涓埗緇撶偣銆傚茍鎶婁粬浠殑tree[]鐨勭浉搴斿唴瀹規寚鍚戜粬浠殑鐖剁粨鐐廣?br />騫跺湪heap涓垹鎺夎繖涓や釜緇撶偣錛岃屾妸浠栦滑鐨勭埗緇撶偣鍔犲叆鍒癶eap涓?br /><br />heaplen 涓篽eap涓粨鐐圭殑涓暟錛屾瘡嬈$敱浜庤鍒?涓粨鐐癸紝鍔?涓粨鐐癸紝鎵浠ユ瘡嬈′細浣縣eaplen--錛屼篃灝辨槸緇撶偣鏁板彉灝戜竴涓?br /><br />絳夊埌heaplen錛屼篃灝辨槸緇撶偣鏁幫紝灝忎簬2鏃訛紝璇存槑鏍戝凡緇忚寮勫ソ浜嗐?br /><br />鏍戠敓鎴愬ソ涔嬪悗錛宼ree[]涓殑鍩?freq 鍜?dad 閮借璁劇疆濂戒簡錛岃皟鐢?gen_bitlen()錛屼負浠栦滑鐢熸垚浣嶉暱銆?br /><br />gen_bitlen()涓紝<br /><br />浠庢牴寮濮嬶紝鏍圭殑浣嶉暱涓?錛屽悜涓嬶紝涓烘瘡涓粨鐐硅緗綅闀褲?br /><br />鍒ゆ柇鏄惁涓哄彾瀛愮粨鐐癸紝鍒ゆ柇鐨勬柟娉曟槸錛岀湅鏄惁澶т簬鏈澶т唬鐮侊紝榪欓噷鏈澶т唬鐮佹槸286銆?br /><br />褰撻亣鍒板彾瀛愮粨鐐規椂錛岃繘琛屽姩鎬佺紪鐮佹暣涓枃浠剁殑鎬諱綅闀跨殑璁$畻錛屽拰榪涜闈欐佺紪鐮佹暣涓枃浠剁殑鎬諱綅闀跨殑璁$畻銆?br />bl_count[bits]++; 鐢ㄦ潵涓浼氬効浜х敓緙栫爜銆?br />鐢變簬鍦ㄥ彾瀛愮粨鐐圭殑freq鍩熶腑淇濆瓨鐫榪欎釜緇撶偣鐨勫嚭鐜版鏁幫紝鐜板湪鍙堟湁浜嗕綅闀匡紝鎵浠ュ彲浠ヨ綆楄緇撶偣鐨勫姩鎬佷綅闀褲?br />鑰屾墍鏈夌殑緇撶偣鐨勫姩鎬佷綅闀跨瘡鍔犲湪涓璧峰氨鏄諱綅闀褲?br />鏈変簡鍑虹幇嬈℃暟錛屽浜庨潤鎬侊紝緇撶偣浣嶉暱鏄瀹氬ソ鐨勶紝涔熷悓鏍峰彲浠ヨ繘琛岃綆椼?br /><br />鏈鍚庤皟鐢?gen_codes()錛屼負鎵鏈夊彾瀛愮粨鐐逛駭鐢熺紪鐮併傚拰闈欐丠uffman涓殑鏂規硶鏄浉鍚岀殑銆?br /><br />璋冪敤 build_tree() 寤虹珛 鍖歸厤璺濈鑼冨洿錛堜篃灝辨槸dyn_dtree鐨勫彾瀛愮粨鐐癸紝鍏?0涓級 鐨勬爲錛屽茍涓轟粬浠紙鍖歸厤璺濈鑼冨洿錛夌紪鐮併傚拰鐢熸垚dyn_ltree鐨勬柟娉曟槸鐩稿悓鐨勩?br /><br />璋冪敤 build_bl_tree() 涓簂錛坙iteral&鍖歸厤闀垮害錛夊拰d錛堝尮閰嶈窛紱伙級鐨勪綅闀挎暟緇?鐢熸垚鏍戯紝騫朵負榪欎簺浣嶉暱緙栫爜銆?br /><br />璋冪敤scan_tree緇熻涓涓爲涓殑緙栫爜闀垮害鎯呭喌銆?br />鍒嗗埆瀵筪yn_ltree鍜宒yn_dtree榪涜緇熻銆?br /><br />scan_tree((ct_data near *)dyn_ltree, l_desc.max_code);<br />scan_tree((ct_data near *)dyn_dtree, d_desc.max_code);<br /><br />緇熻緇撴灉鏀懼湪 bl_tree[].Freq 涓?br /><br />寮勬槑鐧戒簡bl_tree[]涓彾瀛愮粨鐐圭殑鍚箟錛屽氨寰堝鏄撶悊瑙can_tree涓墍浣滅殑宸ヤ綔銆?br />姣斿 bl_tree[0].Freq 琛ㄧず緙栫爜浣嶉暱涓?鐨勭紪鐮佷釜鏁般?br />bl_tree[10].Freq 琛ㄧず緙栫爜浣嶉暱涓?0鐨勭紪鐮佷釜鏁般?br />bl_tree[16].Freq 琛ㄧず 榪炵畫鍑犱釜緙栫爜闀垮害鐨勫嚭鐜頒釜鏁伴兘鐩稿悓錛岃繖縐嶆儏鍐電殑鍑虹幇嬈℃暟銆?br /><br />鏈鍚庤皟鐢?build_tree() 寤虹珛浣嶉暱鎯呭喌錛堝氨鏄偅19縐嶆儏鍐碉級鐨勬爲錛屽茍涓轟粬浠紙灝辨槸閭?9縐嶆儏鍐碉級緙栫爜銆?br /><br />鍙戦佺敤bl_tree緙栫爜鐨勭粨鐐逛綅闀挎暟緇勩?br />defalte綆楁硶涓紝鍙鐭ラ亾浜嗕竴涓爲鐨勬瘡涓彾瀛愮粨鐐圭殑浣嶉暱錛屽氨鍙互寰楀埌璇ュ彾瀛愮粨鐐圭殑緙栫爜銆?br />鎵浠ユ垜浠渶瑕佸彂閫乴tree鐨?86涓彾瀛愮粨鐐圭殑浣嶉暱錛屾垜浠渶瑕佸彂閫乨tree鐨?0涓彾瀛愮粨鐐圭殑浣嶉暱銆?br /><br />棣栧厛鍙戦佷笁涓爲鐨勬渶澶у彾瀛愮粨鐐瑰肩殑涓涓彉褰€?br />send_bits(lcodes-257, 5); 鍙戦乴tree鏈夋晥鏈澶у彾瀛愮粨鐐瑰?1-257<br />send_bits(dcodes-1, 5); 鍙戦乨tree鏈夋晥鏈澶у彾瀛愮粨鐐瑰?1-1<br />send_bits(blcodes-4, 4); 鍙戦乥l_tree鏈夋晥鏈澶у彾瀛愮粨鐐瑰?1-4銆?br />ltree鏈澶у彾瀛愮粨鐐瑰鹼紝灝卞喅瀹氫簡鎴戜滑灝嗚鍙戦佺殑ltree鐨勫彾瀛愮粨鐐逛綅闀挎暟緇勭殑涓暟銆傚彧鍙戦佸埌鏈夋晥鏈澶у彾瀛愮粨鐐規暟灝辮浜嗐?br />姣斿錛宭tree鏈夋晥鏈澶у彾瀛愮粨鐐瑰間負0x102鐨勮瘽錛岄偅涔堟垜浠彧闇瑕佸彂閫乴tree涓墠0x103涓殑浣嶉暱錛屽茍鍛婅瘔瑙e帇緙╃▼搴忥紝鍙戦佷簡0x103涓氨琛屼簡銆?br /><br />鍙戦?bl_tree 鐨勪綅闀匡紝娉ㄦ剰鍙戦佺殑欏哄簭鏄寜 bl_order[] 涓瀹氱殑欏哄簭鍙戦佺殑銆?br /><br />璋冪敤 send_tree() 鍏堝悗鍙戦?dyn_ltree,dyn_dtree 鐨勪綅闀褲?br /><br />send_tree()涓嬌鐢ㄥ拰scan_tree()涓浉鍚岀殑鏂規硶錛岄鍏堢湅榪欎簺浣嶉暱灞炰簬bl_tree鐨?9涓彾瀛愮粨鐐瑰搴旂殑19縐嶆儏鍐典腑鐨勫摢涓縐嶏紝紜畾浜嗘槸鍝竴縐嶄箣鍚庯紝<br />灝辨寜榪欑鎯呭喌瀵瑰簲鐨勫彾瀛愮粨鐐癸紝鍦╞l_tree涓殑緙栫爜錛屽彂閫佽繖涓紪鐮併傜洿鍒版妸榪欎簺浣嶉暱閮藉彂瀹屻?br /><br />鐢℉uffman緙栫爜瀵筁Z77澶勭悊緇撴灉榪涜緙栫爜杈撳嚭銆傚拰闈欐丠uffman緙栫爜鏃朵嬌鐢ㄧ殑鏂規硶鏄浉鍚岀殑銆?br /><br />2.13 瑕佺偣<br /><br />絎竴錛岀渷鍘諱簡LZ77鐢ㄦ潵鎸囨槑鏄?娌℃湁鏀瑰姩鐨勫瓧鑺?榪樻槸"鍖歸厤鐨勪俊鎭"鐨勯偅涓爣蹇椾綅銆?br /><br />鐢變簬gzip瀹炵幇涓紝鎶婂尮閰嶉暱搴︾殑鑼冨洿鍜屽瓧鑺傚鹼紝鍋氫負涓嶅悓鐨勫彾瀛愮粨鐐硅繘琛岀紪鐮併傛瘮濡傝錛屽間負1鐨勫瓧鑺傦紝鍜屼竴涓間負1鐨勫尮閰嶉暱搴︼紝浠栦滑鐨勫艱櫧鐒剁浉鍚岋紝浣嗘槸浠栦滑鏄笉鍚岀殑鍙跺瓙緇撶偣錛屼粬浠殑緙栫爜涔熸槸涓嶅悓鐨勩傝繖鏍蜂竴鏉ワ紝瑙e帇緙╂椂錛屽氨鍙互鐩存帴鍖哄垎錛屽氨涓嶅繀鍐嶈緭鍑洪偅涓寚紺轟綅浜嗐?br /><br />榪欎釜鑺傜渷瀵瑰帇緙╃巼鐨勬敼鍠勫簲璇ユ湁涓嶅皬鐨勫府鍔┿?br /><br />闈欐丠uffman緙栫爜鏃訛紝緙栫爜鏈韓涓嶄細璧峰埌浠涔堝帇緙╀綔鐢紝浣嗘槸榪樹細浠庤繖涓妭鐪佷腑鑾風泭銆?br /><br />絎簩錛屽彾瀛愮粨鐐規墍琛ㄧず鐨勫唴瀹廣?br /><br />鎴戜滑鐪嬪埌gzip鐨勫疄鐜頒腑錛屽彾瀛愯妭鐐規墍浠h〃鐨勫唴瀹瑰悇縐嶅悇鏍鳳紝涓嶄粎浠呮槸涓涓浐瀹氱殑鍊鹼紝鑰屼笖鏈変簺浠h〃浜嗕竴涓肩殑鑼冨洿錛岋紙鐒跺悗鐢ㄤ箣鍚庣殑鏇村鐨勪綅鏉ヨ〃紺鴻繖涓寖鍥翠腑鐨勪竴涓鹼級錛岃屼笖榪樻湁浠h〃鎯呭喌鐨勩?br /><br />榪欎釜瀹炵幇鏂規硶鏄浉褰撲笉閿欑殑錛岄潪甯稿煎緱鍊熼壌銆?br /><br />瑙e帇緙╀篃涓嶈浜嗭紝鍘熷洜鐪嬫渶鍚庛?br /><br />2.14 鍖歸厤寤朵幾鍒發ookahead涓?br /><br />鍙互榪涜榪欑鍘嬬緝錛屼笌瑙e帇緙╋紝鍏抽敭鏄В鍘嬬緝鐨勫鐞嗕腑錛屽仛浜嗙壒鍒殑澶勭悊銆?br /><br />渚嬶紝涓?0aaaaa<br /><br />榪涜lz77鍘嬬緝鏃訛紝褰撲粖琛屽埌涓嬮潰浣嶇疆鏃?0a 褰撳墠浣嶇疆->aaaa<br />鍖歸厤浼氬歡浼稿埌lookahead涓紝緇撴灉灝辨槸 0a[鍖歸厤闀垮害4錛岃窛紱?]<br /><br />瑙e帇緙╂椂錛岄鍏?a琚仛涓烘病鏈夋敼鍔ㄧ殑瀛楄妭瑙e帇鍑烘潵錛?br />鐒跺悗瑙e帇鍙戠幇[鍖歸厤闀垮害4錛岃窛紱?]錛?br />榪欓噷灝嗗仛涓涓垽鏂紝鐪嬫湁娌℃湁寤朵幾鍒發ookahead涓紝濡傛灉鏈夌殑璇濓紝灝嗗仛鐗瑰埆鐨勫鐞嗭紝涓涓瓧鑺備竴涓瓧鑺傜殑榪涜澶嶅埗銆?br /><br /><b>3 鏈鍚?/b><br /><br />聽聽聽 涓涓漢錛屼粠鎵捐祫鏂欙紝鍒拌璧勬枡錛屽埌璇誨畬婧愮爜錛屽埌鍐欒繖涓笢瑗匡紝鑺變簡涓夊懆澶氱殑鏃墮棿錛屽お鎱簡銆備腑闂村埌澶勬壘浜哄笇鏈涘彲浠ヤ竴璧鋒潵鎼烇紝涔熸病鎵劇潃銆傚お鎱簡錛屽お鑺辨椂闂翠簡錛岃屼笖 涓涓漢錛岃屼笖銆傚弽姝d竴鎯寵搗榪欎簨錛屽氨寰楁唱姘存墦婀夸簡鍙岀溂錛屾唱榪囦笁宸′互鍚庯紝榪樺緱鎶婅剸瀛愪幾闀匡紝澶翠話鎴愪竴涓搴︼紝鍚熼亾:"鎴戣鍙ゆ様涔嬭嫳闆勶紝鎱鋒叏鐒惰鏉厭涓備箟閲嶇敓杞? 姝葷煡宸憋紝鎵浠ヤ笌浜烘垚澶у姛"銆傚摥涔熷摥浜嗭紝璇椾篃蹇典簡錛屽洖鍛充竴涓嬭繖宸ㄦ劅浜虹殑涓濂楋紝鑷繁鎶婅嚜宸卞張鎰熷姩鐨勪笉琛岋紝浜庢槸鍐嶆潵涓閬嶃傚姝よ繖鑸紝涓閬嶄竴閬嶏紝鎯ㄤ笉蹇嶇澒銆傚攭錛岃繕 鏄騫插悧騫插悧鍘誨惂銆?br /><br /><b>鍙傝冭祫鏂欙細</b><br />銆婃暟鎹帇緙╂妧鏈師鐞嗕笌鑼冧緥銆?br />rfc1951 </p> <p> <br />嬈㈣繋浜ゆ祦錛屾榪庝氦鏈嬪弸錛?br />嬈㈣繋璁塊棶<br />涓婚〉 <a target="_blank"><font color="#000080">http://jiurl.yeah.net</font></a><a target="_blank"><font color="#000080">http://jiurl.nease.net</font></a> 璁哄潧 <a target="_blank"><font color="#000080">http://jiurl.cosoft.org.cn/forum</font></a></p> <p>f鍟妅錛屼笉甯︿綘浠繖鏍風殑鍟婏紝鏈夊ソ浜嬩笉鍙垜銆?</p> </td> </tr> </tbody> </table> </div> <img src ="http://m.shnenglu.com/swo2006/aggbug/11453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/swo2006/" target="_blank">swo</a> 2006-08-19 14:54 <a href="http://m.shnenglu.com/swo2006/articles/11453.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>lzw鍘嬬緝綆楁硶鐨刢璇█瀹炵幇http://m.shnenglu.com/swo2006/articles/11431.htmlswoswoSat, 19 Aug 2006 01:45:00 GMThttp://m.shnenglu.com/swo2006/articles/11431.htmlhttp://m.shnenglu.com/swo2006/comments/11431.htmlhttp://m.shnenglu.com/swo2006/articles/11431.html#Feedback0http://m.shnenglu.com/swo2006/comments/commentRss/11431.htmlhttp://m.shnenglu.com/swo2006/services/trackbacks/11431.html
(1)聽聽lzw.h聽聽聽聽聽聽瀹氫箟浜嗕竴浜涘熀鏈殑鏁版嵁緇撴瀯錛屽父閲忥紝榪樻湁鍙橀噺鐨勫垵濮嬪寲絳夈?br />
#ifndef __LZW_H__
#define __LZW_H__
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <memory.h>
//------------------------------------------------------------------------------
#define LZW_BASE聽聽聽聽0x102//聽聽The code base
#define CODE_LEN聽聽聽聽聽聽聽12聽聽聽//聽聽Max code length
#define TABLE_LEN聽聽聽聽聽聽4099 // It must be prime number and bigger than 2^CODE_LEN=4096.
聽聽聽聽聽聽聽// Such as 5051 is also ok.
#define BUFFERSIZE聽聽聽聽聽1024
//------------------------------------------------------------------------------
typedef struct
{
聽聽聽聽HANDLE聽聽聽聽聽聽h_sour;聽聽// Source file handle.
聽聽聽聽HANDLE聽聽聽聽聽聽h_dest;聽聽// Destination file handle.
聽聽聽聽
聽聽聽聽HANDLE聽聽聽聽聽聽h_suffix; // Suffix table handle.
聽聽聽聽HANDLE聽聽聽聽聽聽h_prefix; // Prefix table handle.
聽聽聽聽HANDLE聽聽聽聽聽聽h_code;聽聽// Code table handle.
聽聽聽聽
聽聽聽聽LPWORD聽聽聽聽聽聽lp_prefix; // Prefix table head pointer.
聽聽聽聽LPBYTE聽聽聽聽聽聽lp_suffix; // Suffix table head pointer.
聽聽聽聽LPWORD聽聽聽聽聽聽lp_code; // Code table head pointer.

聽聽聽聽WORD聽聽聽聽聽聽聽聽code;
聽聽聽聽WORD聽聽聽聽聽聽聽聽prefix;
聽聽聽聽BYTE聽聽聽聽聽聽聽聽suffix;

聽聽聽聽BYTE聽聽聽聽聽聽聽聽cur_code_len; // Current code length.[ used in Dynamic-Code-Length mode ]

}LZW_DATA,*PLZW_DATA;


typedef struct
{
聽聽聽聽WORD聽聽聽聽聽聽聽聽top;
聽聽聽聽WORD聽聽聽聽聽聽聽聽index;

聽聽聽聽LPBYTE聽聽聽聽聽聽lp_buffer;
聽聽聽聽HANDLE聽聽聽聽聽聽h_buffer;
聽聽聽聽
聽聽聽聽BYTE聽聽聽聽聽聽聽聽by_left;
聽聽聽聽DWORD聽聽聽聽聽聽聽dw_buffer;

聽聽聽聽BOOL聽聽聽聽聽聽聽聽end_flag;

}BUFFER_DATA,*PBUFFER_DATA;


typedef struct聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//Stack used in decode
{
WORD聽聽聽聽聽聽聽聽index;
HANDLE聽聽聽聽聽聽h_stack;
LPBYTE聽聽聽聽聽聽lp_stack;

}STACK_DATA,*PSTACK_DATA;
//------------------------------------------------------------------------------
VOID stack_create( PSTACK_DATA stack )
{
stack->h_stack聽聽= GlobalAlloc( GHND , TABLE_LEN*sizeof(BYTE) );
stack->lp_stack = GlobalLock( stack->h_stack );
stack->index = 0;
}
//------------------------------------------------------------------------------
VOID stack_destory( PSTACK_DATA stack )
{
GlobalUnlock( stack->h_stack );
聽聽聽聽GlobalFree聽聽( stack->h_stack );
}
//------------------------------------------------------------------------------
VOID buffer_create( PBUFFER_DATA聽聽聽聽buffer )
{
聽聽聽聽buffer->h_buffer聽聽聽= GlobalAlloc(聽聽GHND,聽聽BUFFERSIZE*sizeof(BYTE)聽聽);
聽聽聽聽buffer->lp_buffer聽聽= GlobalLock( buffer->h_buffer );
聽聽聽聽buffer->top聽聽聽聽聽聽聽聽= 0;
聽聽聽聽buffer->index聽聽聽聽聽聽= 0;
聽聽聽聽buffer->by_left聽聽聽聽= 0;
聽聽聽聽buffer->dw_buffer聽聽= 0;
聽聽聽聽buffer->end_flag聽聽聽= FALSE;
}
//------------------------------------------------------------------------------
VOID buffer_destory( PBUFFER_DATA聽聽聽buffer )
{
聽聽聽聽GlobalUnlock( buffer->h_buffer );
聽聽聽聽GlobalFree聽聽( buffer->h_buffer );
}
//------------------------------------------------------------------------------
VOID re_init_lzw( PLZW_DATA lzw )聽聽聽聽//When code table reached its top it should
{聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//be reinitialized.聽聽聽聽聽聽
聽聽聽聽memset( lzw->lp_code, 0xFFFF, TABLE_LEN*sizeof(WORD) );
聽聽聽聽lzw->code聽聽聽聽聽聽聽聽聽聽= LZW_BASE;
聽聽聽聽lzw->cur_code_len聽聽= 9;
}
//------------------------------------------------------------------------------
VOID lzw_create(PLZW_DATA聽聽聽聽lzw,聽聽聽聽HANDLE h_sour,聽聽聽聽HANDLE h_dest)
{
WORD i;
聽聽聽聽lzw->h_code聽聽聽聽聽聽聽聽= GlobalAlloc( GHND, TABLE_LEN*sizeof(WORD) );
聽聽聽聽lzw->h_prefix聽聽聽聽聽聽= GlobalAlloc( GHND, TABLE_LEN*sizeof(WORD) );
聽聽聽聽lzw->h_suffix聽聽聽聽聽聽= GlobalAlloc( GHND, TABLE_LEN*sizeof(BYTE) );
聽聽聽聽lzw->lp_code聽聽聽聽聽聽聽= GlobalLock( lzw->h_code聽聽聽);
聽聽聽聽lzw->lp_prefix聽聽聽聽聽= GlobalLock( lzw->h_prefix );
聽聽聽聽lzw->lp_suffix聽聽聽聽聽= GlobalLock( lzw->h_suffix );
聽聽聽聽lzw->code聽聽聽聽聽聽聽聽聽聽= LZW_BASE;
聽聽聽聽lzw->cur_code_len聽聽= 9;
聽聽聽聽lzw->h_sour聽聽聽聽聽聽聽聽= h_sour;
聽聽聽聽lzw->h_dest聽聽聽聽聽聽聽聽= h_dest;
聽聽聽聽memset( lzw->lp_code, 0xFFFF, TABLE_LEN*sizeof(WORD) );

}
//------------------------------------------------------------------------------
VOID lzw_destory(PLZW_DATA聽聽聽聽lzw)
{聽聽
聽聽聽聽GlobalUnlock( lzw->h_code聽聽聽);
聽聽聽聽GlobalUnlock( lzw->h_prefix );
聽聽聽聽GlobalUnlock( lzw->h_suffix );

GlobalFree( lzw->h_code聽聽);
聽聽聽聽GlobalFree( lzw->h_prefix );
聽聽聽聽GlobalFree( lzw->h_suffix );聽聽聽聽
}
//------------------------------------------------------------------------------
#endif

(2) fileio.h聽聽聽瀹氫箟浜嗕竴浜涙枃浠舵搷浣?br />
#ifndef __FILEIO_H__
#define __FILEIO_H__
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
//------------------------------------------------------------------------------
HANDLE聽聽file_handle(CHAR* file_name)
{
聽聽聽聽HANDLE h_file;
聽聽聽聽h_file = CreateFile(file_name,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽GENERIC_READ|GENERIC_WRITE,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽FILE_SHARE_READ|FILE_SHARE_WRITE,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽NULL,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽OPEN_ALWAYS,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽NULL
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽);
聽聽聽聽return h_file;
}
//------------------------------------------------------------------------------
WORD load_buffer(HANDLE h_sour, PBUFFER_DATA buffer)聽聽// Load file to buffer
{
聽聽聽聽DWORD ret;
聽聽聽聽ReadFile(h_sour,buffer->lp_buffer,BUFFERSIZE,&ret,NULL);
聽聽聽聽buffer->index = 0;
聽聽聽聽buffer->top = (WORD)ret;
聽聽聽聽return (WORD)ret;
}
//------------------------------------------------------------------------------
WORD empty_buffer( PLZW_DATA lzw, PBUFFER_DATA buffer)// Output buffer to file
{
聽聽聽
聽聽聽聽DWORD ret;
聽聽聽聽if(buffer->end_flag) // The flag mark the end of decode
{
聽聽if( buffer->by_left )
聽聽{
聽聽聽buffer->lp_buffer[ buffer->index++ ] = (BYTE)( buffer->dw_buffer >> 32-buffer->by_left )<<(8-buffer->by_left);
聽聽}
}
WriteFile(lzw->h_dest, buffer->lp_buffer,buffer->index,&ret,NULL);
聽聽聽聽buffer->index = 0;
聽聽聽聽buffer->top = ret;
聽聽聽聽return (WORD)ret;
}
//------------------------------------------------------------------------------
#endif

(3) hash.h聽聽瀹氫箟浜嗗帇緙╂椂鎵鐢ㄧ殑鐮佽〃鎿嶄綔鍑芥暟錛屼負浜嗗揩閫熸煡鎵句嬌鐢ㄤ簡hash綆楁硶錛岃繕鏈夊鐞唄ash鍐茬獊鐨勫嚱鏁?br />
#ifndef __HASH_H__
#define __HASH_H__
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
//------------------------------------------------------------------------------
#define聽聽聽DIV聽聽聽聽聽聽聽TABLE_LEN
#define聽聽聽HASHSTEP聽聽13聽聽聽聽聽聽聽聽聽// It should bigger than 0.
//------------------------------------------------------------------------------
WORD get_hash_index( PLZW_DATA lzw )
{
聽聽聽聽DWORD tmp;
聽聽聽聽WORD result;
聽聽聽聽DWORD prefix;
聽聽聽聽DWORD suffix;
聽聽聽聽prefix = lzw->prefix;
聽聽聽聽suffix = lzw->suffix;
聽聽聽聽tmp = prefix<<8 | suffix;
聽聽聽聽result = tmp % DIV;
聽聽聽聽return result;
}
//------------------------------------------------------------------------------
WORD re_hash_index( WORD hash ) // If hash conflict occured we must recalculate
{聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// hash index .
聽聽聽聽WORD result;
聽聽聽聽result = hash + HASHSTEP;
聽聽聽聽result = result % DIV;
聽聽聽聽return result;
}
//------------------------------------------------------------------------------
BOOL in_table( PLZW_DATA lzw ) // To find whether current code is already in table.
{
聽聽聽聽BOOL result;
聽聽聽聽WORD hash;

聽聽聽聽hash = get_hash_index( lzw );
聽聽聽聽if( lzw->lp_code[ hash ] == 0xFFFF )
聽聽聽聽{
聽聽聽聽聽聽聽聽result = FALSE;聽聽聽聽
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽聽聽聽if( lzw->lp_prefix[ hash ] == lzw->prefix &&
聽聽聽聽聽聽聽聽聽聽聽聽lzw->lp_suffix[ hash ] == lzw->suffix )
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽result = TRUE;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽else
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽result = FALSE;
聽聽聽聽聽聽聽聽聽聽聽聽while( lzw->lp_code[ hash ] != 0xFFFF )
聽聽聽聽聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if( lzw->lp_prefix[ hash ] == lzw->prefix &&
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽lzw->lp_suffix[ hash ] == lzw->suffix )
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽result = TRUE;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽break;聽聽聽聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽hash = re_hash_index( hash );
聽聽聽聽聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽}
聽聽聽聽}
聽聽聽聽return result;
}
//------------------------------------------------------------------------------
WORD get_code( PLZW_DATA lzw )
{
聽聽聽聽WORD hash;
聽聽聽聽WORD code;
聽聽聽聽hash = get_hash_index( lzw );
聽聽聽聽if( lzw->lp_prefix[ hash ] == lzw->prefix &&
聽聽聽聽聽聽聽聽lzw->lp_suffix[ hash ] == lzw->suffix )
聽聽聽聽{
聽聽聽聽聽聽聽聽code = lzw->lp_code[ hash ];
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽聽聽聽while( lzw->lp_prefix[ hash ] != lzw->prefix ||
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽lzw->lp_suffix[ hash ] != lzw->suffix )
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽hash = re_hash_index( hash );聽聽聽聽
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽code = lzw->lp_code[ hash ];
聽聽聽聽}
聽聽聽聽return code;
}
//------------------------------------------------------------------------------
VOID insert_table( PLZW_DATA lzw )
{

聽聽聽聽WORD hash;
聽聽聽聽hash = get_hash_index( lzw );
聽聽聽聽if( lzw->lp_code[ hash ] == 0xFFFF )
聽聽聽聽{
聽聽聽聽聽聽聽聽lzw->lp_prefix[ hash ] = lzw->prefix;
聽聽聽聽聽聽聽聽lzw->lp_suffix[ hash ] = lzw->suffix;
聽聽聽聽聽聽聽聽lzw->lp_code[ hash ]聽聽聽= lzw->code;
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽聽聽聽while( lzw->lp_code[ hash ] != 0xFFFF )
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽hash = re_hash_index( hash );聽聽聽聽
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽lzw->lp_prefix[ hash ] = lzw->prefix;
聽聽聽聽聽聽聽聽lzw->lp_suffix[ hash ] = lzw->suffix;
聽聽聽聽聽聽聽聽lzw->lp_code[ hash ]聽聽聽= lzw->code;
聽聽聽聽}

}
//------------------------------------------------------------------------------


#endif

(4) encode.h聽聽鍘嬬緝紼嬪簭涓誨嚱鏁?br />
#ifndef __ENCODE_H__
#define __ENCODE_H__
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

//------------------------------------------------------------------------------
VOID output_code( DWORD code ,PBUFFER_DATA out, PLZW_DATA lzw)
{
聽聽聽聽out->dw_buffer |= code << ( 32 - out->by_left - lzw->cur_code_len );
聽聽聽聽out->by_left += lzw->cur_code_len;

聽聽聽聽while( out->by_left >= 8 )
聽聽聽聽{
聽聽聽聽聽聽聽聽if( out->index == BUFFERSIZE )
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽empty_buffer( lzw,out);
聽聽聽聽聽聽聽聽}

聽聽聽聽聽聽聽聽out->lp_buffer[ out->index++ ] = (BYTE)( out->dw_buffer >> 24 );
聽聽聽聽聽聽聽聽out->dw_buffer <<= 8;
聽聽聽聽聽聽聽聽out->by_left -= 8;
聽聽聽聽}
}
//------------------------------------------------------------------------------
VOID do_encode( PBUFFER_DATA in, PBUFFER_DATA out, PLZW_DATA lzw)
{
聽聽聽聽WORD prefix;
聽聽聽聽while( in->index != in->top )
聽聽聽聽{
聽聽聽聽聽聽聽聽if( !in_table(lzw) )
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// current code not in code table
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// then add it to table and output prefix


聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽insert_table(lzw);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽prefix = lzw->suffix;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽output_code( lzw->prefix ,out ,lzw );
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽lzw->code++;

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if( lzw->code == (WORD)1<< lzw->cur_code_len )
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// code reached current code top(1<<cur_code_len)
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// then current code length add one
聽聽聽聽聽lzw->cur_code_len++;
聽聽聽聽聽if( lzw->cur_code_len == CODE_LEN + 1 )
聽聽聽聽聽{
聽聽聽聽聽聽re_init_lzw( lzw );
聽聽聽聽聽}

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽else
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// current code already in code table
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽// then output nothing
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽prefix = get_code(lzw);

聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽lzw->prefix = prefix;
聽聽聽聽聽聽聽聽lzw->suffix = in->lp_buffer[ in->index++ ];
聽聽聽聽}
}

//------------------------------------------------------------------------------
VOID encode(HANDLE h_sour,HANDLE h_dest)
{
聽聽聽聽LZW_DATA聽聽聽聽聽聽聽聽lzw;
聽聽聽聽BUFFER_DATA聽聽聽聽聽in ;
聽聽聽聽BUFFER_DATA聽聽聽聽聽out;
聽聽聽聽
聽聽聽聽BOOL first_run = TRUE;

聽聽聽聽lzw_create( &lzw ,h_sour,h_dest );
聽聽聽聽buffer_create( &in );
聽聽聽聽buffer_create( &out );


聽聽聽聽while( load_buffer( h_sour, &in ) )
聽聽聽聽{
聽聽聽聽聽聽聽聽if( first_run )
聽聽聽聽聽聽聽聽{// File length should be considered聽聽but here we simply
聽聽聽聽聽聽聽聽聽// believe file length bigger than 2 bytes.
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽lzw.prefix = in.lp_buffer[ in.index++ ];
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽lzw.suffix = in.lp_buffer[ in.index++ ];
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽first_run = FALSE;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽do_encode(&in , &out, &lzw);
聽聽聽聽}
聽聽聽聽
output_code(lzw.prefix, &out , &lzw);
output_code(lzw.suffix, &out , &lzw);
out.end_flag = TRUE;
聽聽聽聽empty_buffer( &lzw,&out);

聽聽聽聽lzw_destory( &lzw );
聽聽聽聽buffer_destory( &in );
聽聽聽聽buffer_destory( &out );
}

//------------------------------------------------------------------------------

#endif

(5) decode.h聽聽瑙e帇鍑芥暟涓誨嚱鏁?br />
#ifndef __DECODE_H__
#define __DECODE_H__
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
//------------------------------------------------------------------------------
VOID out_code( WORD code ,PBUFFER_DATA buffer,PLZW_DATA lzw,PSTACK_DATA stack)
{
WORD tmp;
if( code < 0x100 )
{
聽聽stack->lp_stack[ stack->index++ ] = code;
}
else
{
聽聽聽stack->lp_stack[ stack->index++ ] = lzw->lp_suffix[ code ];
聽聽聽tmp = lzw->lp_prefix[ code ];
聽聽聽while( tmp > 0x100 )
聽聽聽{
聽聽聽聽stack->lp_stack[ stack->index++ ] = lzw->lp_suffix[ tmp ];
聽聽聽聽tmp = lzw->lp_prefix[ tmp ];
聽聽聽}
聽聽聽stack->lp_stack[ stack->index++ ] = (BYTE)tmp;

}


while( stack->index )
{
聽聽if( buffer->index == BUFFERSIZE )
聽聽{
聽聽聽empty_buffer(lzw,buffer);
聽聽}
聽聽buffer->lp_buffer[ buffer->index++ ] = stack->lp_stack[ --stack->index ] ;
}
}
//------------------------------------------------------------------------------
VOID insert_2_table(PLZW_DATA lzw )
{

lzw->lp_code[ lzw->code ]聽聽聽= lzw->code;
lzw->lp_prefix[ lzw->code ] = lzw->prefix;
lzw->lp_suffix[ lzw->code ] = lzw->suffix;
lzw->code++;

if( lzw->code == ((WORD)1<<lzw->cur_code_len)-1 )
{
聽聽lzw->cur_code_len++;
聽聽if( lzw->cur_code_len == CODE_LEN+1 )
聽聽聽聽聽聽lzw->cur_code_len = 9;
}
if(lzw->code >= 1<<CODE_LEN )
{
聽聽re_init_lzw(lzw);
}

}
//------------------------------------------------------------------------------
WORD get_next_code( PBUFFER_DATA buffer , PLZW_DATA lzw )
{

BYTE next;
WORD code;
while( buffer->by_left < lzw->cur_code_len )
{
聽聽if( buffer->index == BUFFERSIZE )
聽聽{
聽聽聽load_buffer( lzw->h_sour, buffer );
聽聽}
聽聽next = buffer->lp_buffer[ buffer->index++ ];
聽聽buffer->dw_buffer |= (DWORD)next << (24-buffer->by_left);
聽聽buffer->by_left聽聽聽+= 8;
}
code = buffer->dw_buffer >> ( 32 - lzw->cur_code_len );
buffer->dw_buffer <<= lzw->cur_code_len;
buffer->by_left聽聽聽聽-= lzw->cur_code_len;

return code;
}
//------------------------------------------------------------------------------
VOID do_decode( PBUFFER_DATA in, PBUFFER_DATA out, PLZW_DATA lzw, PSTACK_DATA stack)
{
WORD code;
WORD tmp;
while( in->index != in->top聽聽)
{
聽聽code = get_next_code( in ,lzw );

聽聽if( code < 0x100 )
聽聽{
聽聽聽// code already in table
聽聽聽// then simply output the code
聽聽聽lzw->suffix = (BYTE)code;
聽聽}
聽聽else
聽聽{
聽聽聽if( code < lzw->code聽聽)
聽聽聽{
聽聽聽聽// code also in table
聽聽聽聽// then output code chain
聽聽聽聽
聽聽聽聽tmp = lzw->lp_prefix[ code ];
聽聽聽聽while( tmp > 0x100 )
聽聽聽聽{
聽聽聽聽聽tmp = lzw->lp_prefix[ tmp ];
聽聽聽聽}
聽聽聽聽lzw->suffix = (BYTE)tmp;
聽聽聽}
聽聽聽else
聽聽聽{
聽聽聽聽// code == lzw->code
聽聽聽聽// code not in table
聽聽聽聽// add code into table
聽聽聽聽// and out put code
聽聽聽聽tmp = lzw->prefix;
聽聽聽聽while( tmp > 0x100 )
聽聽聽聽{
聽聽聽聽聽tmp = lzw->lp_prefix[ tmp ];
聽聽聽聽}
聽聽聽聽lzw->suffix = (BYTE)tmp;
聽聽聽}
聽聽}
聽聽insert_2_table( lzw );
聽聽out_code(code,out,lzw,stack);

聽聽lzw->prefix = code;

}

}
//------------------------------------------------------------------------------
VOID decode( HANDLE h_sour, HANDLE h_dest )
{
聽聽聽聽LZW_DATA聽聽聽聽聽聽聽聽lzw;
聽聽聽聽BUFFER_DATA聽聽聽聽聽in ;
聽聽聽聽BUFFER_DATA聽聽聽聽聽out;
STACK_DATA聽聽聽聽聽聽stack;
BOOL聽聽聽first_run;

first_run = TRUE;


聽聽聽聽lzw_create( &lzw ,h_sour,h_dest );
聽聽聽聽buffer_create( &in );
聽聽聽聽buffer_create( &out );
stack_create(&stack );

聽聽聽聽while( load_buffer( h_sour, &in ) )
聽聽聽聽{
聽聽if( first_run )
聽聽{
聽聽聽lzw.prefix = get_next_code( &in, &lzw );
聽聽聽lzw.suffix = lzw.prefix;
聽聽聽out_code(lzw.prefix, &out, &lzw , &stack);
聽聽聽first_run = FALSE;
聽聽}
聽聽聽聽聽聽聽聽do_decode(&in , &out, &lzw, &stack);
聽聽聽聽}

聽聽聽聽empty_buffer( &lzw,&out);

聽聽聽聽lzw_destory( &lzw );
聽聽聽聽buffer_destory( &in );
聽聽聽聽buffer_destory( &out );
stack_destory( &stack);
}

#endif

2聽聽涓嬮潰緇欏嚭涓涓簲鐢ㄤ笂闈㈡ā鍧楃殑綆鍗曚緥瀛?br />
#include <stdio.h>
#include <stdlib.h>
//------------------------------------------------------------------------------

#include "lzw.h"
#include "hash.h"
#include "fileio.h"
#include "encode.h"
#include "decode.h"

//------------------------------------------------------------------------------
HANDLE h_file_sour;聽聽
HANDLE h_file_dest;
HANDLE h_file;
CHAR*聽聽file_name_in = "d:\\code.c";
CHAR*聽聽file_name_out= "d:\\encode.e";
CHAR*聽聽file_name聽聽聽聽= "d:\\decode.d";


//------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
聽聽聽聽h_file_sour = file_handle(file_name_in);
聽聽聽聽h_file_dest = file_handle(file_name_out);
聽聽聽聽h_file聽聽聽聽聽= file_handle(file_name);


聽聽encode(h_file_sour, h_file_dest);聽聽
// decode(h_file_dest,h_file);


聽聽聽聽CloseHandle(h_file_sour);
聽聽聽聽CloseHandle(h_file_dest);聽聽
聽聽聽聽CloseHandle(h_file);

聽聽return 0;聽聽聽聽聽聽
}聽聽聽聽

3聽聽鍚庤

聽聽涔嬪墠鐮旂┒gif鏂囦歡鏍煎紡鏃跺伓鐒舵帴瑙︿簡lzw鍘嬬緝綆楁硶錛屼簬鏄氨鎯寵嚜宸卞姩鎵嬪疄鐜般備粠涓寮濮嬬湅浜哄鐨勫師鐮侊紝鐒跺悗璺熺潃妯′豢錛屽埌鐜板湪鐢ㄨ嚜宸辯殑璇█琛ㄨ揪鍑烘潵錛屼粠鐞嗚В鍘熺悊鍒頒唬鐮佺殑瀹炵幇鑺辮垂浜嗕笉灝戞椂闂翠笌綺懼姏錛屼絾鏄湡姝g殑蹇箰涔熷氨鍦ㄨ繖閲岋紝鐜板湪鎶婂ス鎷垮嚭鏉ヨ窡澶у鍒嗕韓涔熷氨鏄垎浜揩涔愩?img src ="http://m.shnenglu.com/swo2006/aggbug/11431.html" width = "1" height = "1" />

swo 2006-08-19 09:45 鍙戣〃璇勮
]]>
Gzip Zlib PNG 鍘嬬緝綆楁硶,婧愮爜璇﹁Вhttp://m.shnenglu.com/swo2006/articles/11430.htmlswoswoSat, 19 Aug 2006 00:51:00 GMThttp://m.shnenglu.com/swo2006/articles/11430.htmlhttp://m.shnenglu.com/swo2006/comments/11430.htmlhttp://m.shnenglu.com/swo2006/articles/11430.html#Feedback0http://m.shnenglu.com/swo2006/comments/commentRss/11430.htmlhttp://m.shnenglu.com/swo2006/services/trackbacks/11430.html 鎴戜滑瀵圭畻娉曞仛涓夌紼嬪害鐨勮鏄庛傜涓縐嶇▼搴︼紝瀵筭zip鎵浣跨敤鍘嬬緝綆楁硶鍩烘湰鍘熺悊鐨勮鏄庛傜浜岀紼嬪害錛屽gzip鍘嬬緝綆楁硶瀹炵幇鏂規硶鐨勮 鏄庛傜涓夌紼嬪害錛屽gzip瀹炵幇婧愮爜綰х殑璇存槑銆?br />銆
銆銆1 gzip鎵浣跨敤鍘嬬緝綆楁硶鐨勫熀鏈師鐞?br /> 銆銆
銆銆gzip 瀵逛簬瑕佸帇緙╃殑鏂囦歡錛岄鍏堜嬌鐢╨z77綆楁硶榪涜鍘嬬緝錛屽寰楀埌鐨勭粨鏋滃啀浣跨敤huffman緙栫爜鐨勬柟娉曡繘琛屽帇緙┿傛墍浠ユ垜浠垎鍒lz77鍜宧uffman緙栫爜鐨勫師鐞嗚繘琛岃鏄庛?br /> 銆銆

銆銆
銆銆2 gzip鍘嬬緝綆楁硶瀹炵幇鏂規硶
銆銆
銆銆2.1 LZ77綆楁硶鐨刧zip瀹炵幇
銆銆
銆銆棣栧厛錛実zip 浠庤鍘嬬緝鐨勬枃浠朵腑璇誨叆64KB鐨勫唴瀹瑰埌涓涓彨window鐨勭紦鍐插尯涓備負浜嗙畝鍗曡搗瑙侊紝鎴戜滑浠?2KB浠ヤ笅鏂囦歡鐨勫帇緙╀負渚嬪仛璇存槑銆傚浜庢垜浠繖閲屼嬌鐢?2KB 浠ヤ笅鏂囦歡錛実zip灝嗘暣涓枃浠惰鍏ュ埌window緙撳啿鍖轟腑銆傜劧鍚庝嬌鐢ㄤ竴涓彨strstart鐨勫彉閲忓湪window鏁扮粍涓紝浠?寮濮嬩竴鐩村悜鍚庣Щ鍔ㄣ? strstart鍦ㄦ瘡涓涓綅緗笂錛岄兘鍦ㄥ畠涔嬪墠鐨勫尯鍩熶腑錛屽鎵懼拰褰撳墠strstart寮濮嬬殑涓茬殑澶?涓瓧鑺傚尮閰嶇殑涓詫紝騫惰瘯鍥句粠榪欎簺鍖歸厤涓蹭腑鎵懼埌鏈闀跨殑鍖歸厤 涓層?br /> 銆銆
銆銆濡傛灉褰撳墠鐨剆trstart寮濮嬬殑涓詫紝鍙互鎵懼埌鏈灝戜負3涓瓧鑺傜殑鍖歸厤涓茬殑璇濓紝褰撳墠鐨剆trstart寮濮嬬殑鍖歸厤闀垮害閭d箞闀跨殑涓詫紝灝嗕細琚竴涓?lt;鍖歸厤闀垮害,鍒板尮閰嶄覆寮澶寸殑璺濈>瀵規浛鎹€?br /> 銆銆
銆銆濡傛灉褰撳墠鐨剆trstart寮濮嬬殑涓詫紝鎵句笉鍒頒換浣曠殑鏈灝戜負3涓瓧鑺傜殑鍖歸厤涓茬殑璇濓紝閭d箞褰撳墠strstart鐨勬墍鍦ㄥ瓧鑺傚皢涓嶄綔鏀瑰姩銆?br /> 銆銆
銆銆涓轟簡鍖哄垎鏄竴涓?lt;鍖歸厤闀垮害,鍒板尮閰嶄覆寮澶寸殑璺濈>瀵癸紝榪樻槸涓涓病鏈夎鏀瑰姩鐨勫瓧鑺傦紝榪橀渶瑕佷負姣忎竴涓病鏈夎鏀瑰姩鐨勫瓧鑺傛垨鑰?lt;鍖歸厤闀垮害,鍒板尮閰嶄覆寮澶寸殑璺濈>瀵癸紝鍙﹀鍐嶅崰鐢ㄤ竴
銆銆浣嶏紝鏉ヨ繘琛屽尯鍒嗐傝繖浣嶅鏋滀負1錛岃〃紺烘槸涓涓?lt;鍖歸厤闀垮害,鍒板尮閰嶄覆寮澶寸殑璺濈>瀵癸紝榪欎綅濡傛灉涓?錛岃〃紺烘槸涓涓病鏈夎鏀瑰姩鐨勫瓧鑺傘?br /> 銆銆
銆銆鐜板湪鏉ヨ鏄庝竴涓嬶紝涓轟粈涔堟渶灝忓尮閰嶄負3涓瓧鑺傘傝繖鏄敱浜庯紝gzip 涓紝<鍖歸厤闀垮害,鍒板尮閰嶄覆寮澶寸殑璺濈>瀵逛腑錛?鍖歸厤闀垮害"鐨勮寖鍥翠負3-258錛屼篃灝辨槸256縐嶅彲鑳藉鹼紝闇瑕?bit鏉ヤ繚瀛樸?鍒板尮閰嶄覆寮澶寸殑 璺濈"鐨勮寖鍥翠負0-32K錛岄渶瑕?5bit鏉ヤ繚瀛樸傛墍浠ヤ竴涓?lt;鍖歸厤闀垮害,鍒板尮閰嶄覆寮澶寸殑璺濈>瀵歸渶瑕?3浣嶏紝宸竴浣?涓瓧鑺傘傚鏋滃尮閰嶄覆灝忎簬 3涓瓧鑺傜殑璇濓紝浣跨敤<鍖歸厤闀垮害,鍒板尮閰嶄覆寮澶寸殑璺濈>瀵硅繘琛屾浛鎹紝涓嶄絾娌℃湁鍘嬬緝錛屽弽鑰岃繕浼氬澶с傛墍浠ヤ繚瀛?lt;鍖歸厤闀垮害,鍒板尮閰嶄覆寮澶寸殑璺? 紱?gt;瀵規墍闇瑕佺殑浣嶆暟錛屽喅瀹氫簡鏈灝忓尮閰嶉暱搴﹁嚦灝戣涓?涓瓧鑺傘?br /> 銆銆
銆銆涓嬮潰鎴戜滑灝辨潵浠嬬粛gzip濡備綍瀹炵幇瀵繪壘褰撳墠strstart寮濮嬬殑涓茬殑鏈闀垮尮閰嶄覆銆?br /> 銆銆
銆銆濡傛灉姣忔涓哄綋鍓嶄覆瀵繪壘鍖歸厤涓叉椂錛岄兘瑕佸拰涔嬪墠鐨勬瘡涓覆鐨勮嚦灝?涓瓧鑺傝繘琛屾瘮杈冪殑璇濓紝閭d箞姣旇緝閲忓皢鏄潪甯擱潪甯稿ぇ鐨勩備負浜嗘彁楂樻瘮杈冮熷害錛実zip浣跨敤浜嗗搱甯? 琛ㄣ傝繖鏄痝zip瀹炵幇LZ77鐨勫叧閿傝繖涓搱甯岃〃鏄竴涓彨head鐨勬暟緇勶紙鍚庨潰鎴戜滑灝嗙湅鍒頒負浠涔堣繖涓紦鍐插尯鍙玥ead錛夈俫zip瀵箇indows涓殑姣? 涓覆錛屼嬌鐢ㄤ覆鐨勫ご涓変釜瀛楄妭錛屼篃灝辨槸strstart,strstart+1,strstart+2錛岀敤涓涓璁″ソ鐨勫搱甯屽嚱鏁版潵榪涜璁$畻錛屽緱鍒頒竴涓彃鍏ヤ綅緗? ins_h銆備篃灝辨槸鐢ㄤ覆鐨勫ご涓変釜瀛楄妭鏉ョ‘瀹氫竴涓彃鍏ヤ綅緗傜劧鍚庢妸涓茬殑浣嶇疆錛屼篃灝辨槸 strstart鐨勫鹼紝淇濆瓨鍦╤ead鏁扮粍鐨勭ins_h欏逛腑銆傛垜浠┈涓婂氨鍙互鐪嬪埌涓轟粈涔堣榪欐牱鍋氥俬ead鏁扮粍鍦ㄦ病鏈夋彃鍏ヤ換浣曞兼椂錛屽叏閮ㄤ負0銆?br />
褰撴煇澶勭殑褰撳墠涓茬殑涓変釜瀛楄妭紜畾浜嗕竴涓猧ns_h錛屽茍鎶婂綋鏃跺綋鍓嶄覆鐨勪綅緗篃灝辨槸褰撴椂鐨剆trstart淇濆瓨鍦ㄤ簡head[ins_h]涓備箣鍚庡彟涓澶勶紝褰撳彟 涓澶勭殑褰撳墠涓茬殑澶翠笁涓瓧鑺傦紝鍐嶄負閭d笁涓瓧鑺傛椂錛屽啀浣跨敤閭d釜鍝堝笇鍑芥暟鏉ヨ綆楋紝鐢變簬鏄悓鏍風殑涓変釜瀛楄妭錛屽悓鏍風殑鍝堝笇鍑芥暟錛屽緱鍒扮殑ins_h蹇呯劧鍜屽墠闈㈠緱鍒扮殑 ins_h鏄浉鍚岀殑銆備簬鏄氨浼氬彂鐜癶ead[ins_h]涓嶄負0銆傝繖灝辮鏄庝簡錛屾湁涓涓ご涓変釜瀛楄妭鍜岃嚜宸辯浉鍚岀殑涓叉妸鑷繁鐨勪綅緗繚瀛樺湪浜嗚繖閲岋紝鐜板湪head [ins_h]涓繚瀛樼殑鍊鹼紝涔熷氨鏄偅涓覆鐨勫紑濮嬩綅緗紝鎴戜滑灝卞彲浠ユ壘鍒伴偅涓覆錛岄偅涓覆鑷沖皯鍓?涓瓧鑺傚拰褰撳墠涓茬殑鍓?涓瓧鑺傜浉鍚岋紙紼嶅悗鎴戜滑灝卞彲浠ョ湅鍒拌繖縐嶈娉? 涓嶅噯紜紝榪欓噷鏄負浜嗚鏄庢柟渚匡級錛屾垜浠彲浠ユ壘鍒伴偅涓覆錛屽仛榪涗竴姝ユ瘮杈冿紝鐪嬪埌搴曡兘鏈夊闀跨殑鍖歸厤銆?br /> 銆銆
銆銆鎴戜滑鐜板湪鏉ヨ鏄庝竴涓嬶紝鐩稿悓鐨勪笁涓瓧鑺傦紝閫氳繃鍝堝笇鍑芥暟寰楀埌鐨刬ns_h蹇呯劧鏄浉鍚岀殑銆傝屼笉鍚岀殑涓変釜瀛楄妭錛岄氳繃鍝堝笇鍑芥暟鏈夋病鏈夊彲鑳藉緱鍒板悓涓涓猧ns_h錛? 鎴戞病鏈夊榪欎釜鍝堝笇鍑芥暟鍋氱爺絀訛紝騫朵笉娓呮錛屼笉榪囦竴鑸殑鍝堝笇鍑芥暟閮芥槸榪欐牱鐨勶紝鎵浠ユ瀬澶у彲鑳借繖閲岀殑涔熶細鏄繖縐嶆儏鍐碉紝鍗充笉鍚岀殑涓変釜瀛楄妭錛岄氳繃鍝堝笇鍑芥暟鏈夊彲鑳藉緱鍒板悓 涓涓猧ns_h錛屼笉榪囪繖騫朵笉瑕佺揣錛屾垜浠彂鐜版湁鍙兘鏄尮閰嶄覆涔嬪悗錛岃繕浼氳繘琛屼覆鐨勬瘮杈冦?br /> 銆銆
銆銆涓涓枃浠朵腑錛屽彲鑳芥湁寰堝涓覆鐨勫ご涓変釜瀛楄妭閮芥槸鐩稿悓鐨勶紝涔熷氨鏄浠栦滑璁$畻寰楀埌鐨刬ns_h閮芥槸鐩稿悓鐨勶紝濡備綍鑳戒繚璇佹壘鍒頒粬浠腑鐨勬瘡涓涓覆鍛紵gzip浣跨敤 涓涓摼鎶婁粬浠摼鍦ㄤ竴璧楓俫zip姣忔鎶婂綋鍓嶄覆鐨勪綅緗彃鍏ead鐨勫綋鍓嶄覆澶翠笁涓瓧鑺傜畻鍑虹殑ins_h澶勬椂錛岄兘浼氶鍏堟妸鍘熸潵鐨刪ead[ins_h]鐨勫鹼紝 淇濆瓨鍒頒竴涓彨prev鐨勬暟緇勪腑錛屼繚瀛樼殑浣嶇疆灝卞湪鐜板湪鐨剆trstart澶勩傝繖鏍峰綋浠ュ悗鏌愬鐨勫綋鍓嶄覆璁$畻鍑篿ns_h錛屽彂鐜癶ead[ins_h]涓嶇┖鏃訛紝 灝卞彲浠ュ埌prev[ head[ins_h] ]涓壘鍒版洿鍓嶄竴涓殑澶翠笁涓瓧鑺傜浉鍚岀殑涓茬殑浣嶇疆銆傚姝ゆ垜浠婦渚嬭鏄庛?br /> 銆銆
銆銆渚嬶紝涓?br /> 銆銆0abcdabceabcfabcg
銆銆^^^^^^^^^^^^^^^^^
銆銆01234567890123456
銆銆
銆銆鏁翠釜涓茶鍘嬬緝紼嬪簭澶勭悊涔嬪悗銆?br /> 銆銆
銆銆鐢盿bc綆楀嚭ins_h銆?br /> 銆銆榪欐椂鐨刪ead[ins_h]涓負 13,鍗?abcg"鐨勫紑濮嬩綅緗?br /> 銆銆榪欐椂prev[13]涓負 9錛屽嵆"abcfabcg"鐨勫紑濮嬩綅緗?br /> 銆銆榪欐椂prev[9]涓負 5錛屽嵆"abceabcfabcg"鐨勫紑濮嬩綅緗?br /> 銆銆榪欐椂prev[5]涓負 1錛屽嵆"abcdabceabcfabcg"鐨勫紑濮嬩綅緗?br /> 銆銆榪欐椂prev[1]涓負 0銆?br /> 銆銆
銆銆鎴戜滑鐪嬪埌鎵鏈夊ご涓変釜瀛楁瘝涓篴bc鐨勪覆錛岃閾懼湪浜嗕竴璧鳳紝浠巋ead鍙互涓鐩存壘涓嬪幓錛岀洿鍒版壘鍒?銆?br /> 銆銆
銆銆鐜板湪鎴戜滑涔熷氨鐭ラ亾浜嗭紝涓変釜瀛楄妭閫氳繃鍝堝笇鍑芥暟璁$畻寰楀埌鍚屼竴ins_h鐨勬墍鏈夌殑涓茶閾懼湪浜嗕竴璧鳳紝head[ins_h]涓洪摼澶達紝prev鏁扮粍涓斁鐫鐨勬洿鏃╃殑涓層傝繖涔熷氨鏄痟ead鍜宲rev鍚嶇О鐨勭敱
銆銆鏉ャ?br /> 銆銆
銆銆gzip瀵繪壘鍖歸厤涓茬殑鍙﹀涓涓煎緱娉ㄦ剰鐨勫疄鐜版槸錛屽歡榪熷尮閰嶃備細榪涜涓ゆ灝濊瘯銆傛瘮濡傚綋鍓嶄覆涓簊tr,閭d箞str鍙戠敓鍖歸厤浠ュ悗錛屽茍涓嶅彂鐢熷帇緙╋紝榪樹細瀵箂tr+1涓茶繘琛屽尮閰嶏紝鐒跺悗鐪嬪摢縐?
銆銆鍖歸厤鏁堟灉濂姐?br /> 銆銆
銆銆渚嬪瓙 ...
銆浠庤繖涓緥瀛愪腑鎴戜滑灝辯湅鍒頒簡鍋氬彟澶栦竴嬈″皾璇曠殑鍘熷洜銆傚鏋滅鍒扮殑涓涓尮閰嶅氨浣跨敤浜嗙殑璇濓紝鍙兘閿欒繃鏇撮暱鍖歸厤鐨勬満浼氥傜幇鍦ㄥ仛涓ゆ浼氭湁鎵鏀瑰杽銆?br /> 銆銆
銆銆...
銆銆
銆銆2.2 闂璁ㄨ
銆銆
銆銆鎴戝湪榪欓噷瀵筭zip鍘嬬緝綆楁硶鍋氬嚭浜嗕竴浜涜鏄庯紝鏄笇鏈涘彲浠ュ拰瀵筭zip鎴栬呭帇緙╄В鍘嬬緝鎰熷叴瓚g殑鏈嬪弸榪涜浜ゆ祦銆?br /> 銆銆鎴戝gzip鐨勪簡瑙h姣旇繖閲岃鐨勬洿澶氫竴浜涳紝涔熸湁鏇村鐨勪緥瀛愩傚鏋滃摢浣嶆湅鍙嬫効鎰忓涓嬮潰鐨勯棶棰樿繘琛岀爺絀訛紝浠ュ強鍏朵粬鍘嬬緝瑙e帇緙╃殑闂榪涜鐮旂┒錛屾潵榪欓噷 http://jiurl.cosoft.org.cn/forum/ 鍜屾垜浜ゆ祦鐨勮瘽錛屾垜涔熸効鎰忓氨鎴戠煡閬撶殑鍐呭榪涜鏇村鐨勮鏄庛?br /> 銆銆
銆銆涓嬮潰鏄嚑涓棶棰?br /> 銆銆
銆銆榪欑鍖歸厤綆楁硶錛屽嵆鐢?涓瓧鑺?鏈灝忓尮閰?鏉ヨ綆椾竴涓暣鏁幫紝鏄惁姣旂敤涓叉瘮杈冩潵寰楅珮鏁堬紝楂樻晥鍒頒粈涔堢▼搴︺?br /> 銆銆
銆銆鍝堝笇鍑芥暟鐨勮璁恒備笉鍚岀殑涓変釜瀛楄妭錛屾槸鍚﹀彲鑳藉緱鍒板悓涓涓猧ns_h銆俰ns_h鍜岃綆楀畠鐨勪笁涓瓧鑺傜殑鍏崇郴銆?br /> 銆銆
銆銆鍑犳寤惰繜灝濊瘯姣旇緝濂斤紵
銆銆
銆銆鐢ㄥ歡榪燂紝涓ゆ灝濊瘯鏄惁瀵瑰帇緙╃巼鐨勬敼鍠勬槸闈炲父鏈夐檺鐨勶紵
銆銆
銆銆褰卞搷lz77鍘嬬緝鐜囩殑鍥犵礌銆?br /> 銆銆
銆銆鍘嬬緝鐨勬瀬闄愩?br /> 銆銆銆銆
銆銆2.3 ...
銆銆
銆銆3 gzip婧愮爜鍒嗘瀽
銆銆
銆銆main() 涓皟鐢ㄥ嚱鏁?treat_file() 銆?br /> 銆銆treat_file() 涓墦寮鏂囦歡錛岃皟鐢ㄥ嚱鏁?zip()銆傛敞鎰忚繖閲岀殑 work 鐨勭敤娉曪紝榪欐槸涓涓嚱鏁版寚閽堛?br /> 銆銆zip() 涓緭鍑篻zip鏂囦歡鏍煎紡鐨勫ご錛岃皟鐢?bi_init錛宑t_init錛宭m_init錛?br /> 銆銆鍏朵腑鍦╨m_init涓皢 head 鍒濆鍖栨竻0銆傚垵濮嬪寲strstart涓?銆備粠鏂囦歡涓鍏?4KB鐨勫唴瀹瑰埌window緙撳啿鍖轟腑銆?br /> 銆銆鐢變簬璁$畻strstart=0鏃剁殑ins_h錛岄渶瑕?,1,2榪欎笁涓瓧鑺傚拰鍝堝笇鍑芥暟鍙戠敓鍏崇郴錛屾墍浠ュ湪lm_init涓紝棰勮0,1涓や釜瀛楄妭錛屽茍鍜屽搱甯屽嚱鏁板彂鐢熷叧緋匯?br /> 銆銆
銆銆鐒跺悗lm_init璋冪敤 deflate()銆?br /> 銆銆deflate() gzip鐨凩Z77鐨勫疄鐜頒富瑕乨eflate()涓?br /> 銆銆...


swo 2006-08-19 08:51 鍙戣〃璇勮
]]>
A Brief History of zlibhttp://m.shnenglu.com/swo2006/articles/11410.htmlswoswoFri, 18 Aug 2006 08:23:00 GMThttp://m.shnenglu.com/swo2006/articles/11410.htmlhttp://m.shnenglu.com/swo2006/comments/11410.htmlhttp://m.shnenglu.com/swo2006/articles/11410.html#Feedback0http://m.shnenglu.com/swo2006/comments/commentRss/11410.htmlhttp://m.shnenglu.com/swo2006/services/trackbacks/11410.html A Brief History of zlib

The origins of zlib can be found in the history of Info-ZIP. Info-ZIP is loosely organized group of programmers who give the following reason for their existence:

Info-ZIP's purpose is to provide free, portable, high-quality versions of the Zip and UnZip compressor-archiver utilities that are compatible with the DOS-based PKZIP by PKWARE, Inc.

These free versions of Zip and UnZip are world class programs, and are in wide use on platforms ranging from the orphaned Amiga through MS-DOS PCs up to high powered RISC workstations. But these programs are designed to be used as command line utilities, not as library routines. People have found that porting the Info-ZIP source into an application could be a grueling exercise.

Fortunately for all of us, two of the Info-ZIP gurus took it upon themselves to solve this problem. Mark Adler and Jean-loup Gailly single-handedly created zlib, a set of library routines that provide a safe, free, and unpatented implementation of the deflate compression algorithm.

One of the driving reasons behind zlib's creation was for use as the compressor for PNG format graphics. After Unisys belatedly began asserting their patent rights to LZW compression, programmers all over the world were thrown into a panic over the prospect of paying royalties on their GIF decoding programs. The PNG standard was created to provide an unencumbered format for graphics interchange. The zlib version of the deflate algorithm was embraced by PNG developers, not only because it was free, but it also compressed better than the original LZW compressor used in GIF files.

zlib turns out to be good for more than graphics developers, however. The deflate algorithm makes an excellent general purpose compressor, and as such can be incorporated into all sorts of different software. For example, I use zlib as the compression engine in Greenleaf's ArchiveLib, a data compression library that work with ZIP archives. It's performance and compatibility mean I didn't have to reinvent the wheel, saving precious months of development time.

zlib's interface

As a library developer, I know that interfaces make or break a library. Performance issues are important, but if an awkward API makes it impossible to integrate a library into your program, you've got a problem.

zlib's interface is confined to just a few simple function calls. The entire state of a given compression or decompression session is encapsulated in a C structure of type z_stream, whose definition is shown in Figure 1.

typedef struct z_stream_s {
Bytef *next_in; /* next input byte */
uInt avail_in; /* number of bytes available at next_in */
uLong total_in; /* count of input bytes read so far */
Bytef *next_out; /* next output byte should be put there */
uInt avail_out; /* remaining free space at next_out */
uLong total_out; /* count of bytes output so far */
char *msg; /* last error message, NULL if no error */
struct internal_state *state; /* not visible by applications*/
alloc_func zalloc; /* used to allocate the internal state*/
free_func zfree; /* used to free the internal state */
voidpf opaque; /* private data passed to zalloc and zfree*/
int data_type; /* best guess about the data: ascii or binary*/
uLong adler; /* adler32 value of the uncompressed data */
uLong reserved; /* reserved for future use */
} z_stream;

Figure 1
The z_stream object definition

Using the library to compress or decompress a file or other data object consists of three main steps:

  • Creating a z_stream object.
  • Processing input and output, using the z_stream object to communicate with zlib.
  • Destroying the z_stream object.

An overview of the process is shown in Figure 2.

Figure 2
The compression or decompression process

Steps 1 and 3 of the compression process are done using conventional function calls. The zlib API, documented in header file zlib.h, prototypes the following functions for initialization and termination of the compression or decompression process:

  • deflateInit()
  • inflateInit()
  • deflateEnd()
  • inflateEnd()

Step 2 is done via repeated calls to either inflate() or deflate(), passing the z_stream object as a parameter. The entire state of the process is contained in that object, so there are no global flags or variables, which allows the library to be completely reentrant. Storing the state of the process in a single object also cuts down on the number of parameters that must be passed to the API functions.

When performing compression or decompression, zlib doesn't perform any I/O on its own. Instead, it reads data from an input buffer pointer that you supply in the z_stream object. You simply set up a pointer to the next block of input data in member next_in, and place the number of available bytes in the avail_in member. Likewise, zlib writes its output data to a memory buffer you set up in the next_out member. As it writes output bytes, zlib decrements the avail_out member until it drops to 0.

Given this interface, Step 2 of the compression process for an input file and an output file might look something like this:

z_stream z;
char input_buffer[ 1024 ];
char output_buffer[ 1024 ];
FILE *fin;
FILE *fout;
int status;
...
z.avail_in = 0;
z.next_out = output_buffer;
z.avail_out = 1024;
for ( ; ; ) {
if ( z.avail_in == 0 ) {
z.next_in = input_buffer;
z.avail_in = fread( input_buffer, 1, 1024, fin );
}
if ( z.avail_in == 0 )
break;
status = deflate( &z, Z_NO_FLUSH );
int count = 1024 - z.avail_out;
if ( count )
fwrite( output_buffer, 1, count, fout );
z.next_out = output_buffer;
z.avail_out = 1024;
}

Figure 3
The code to implement file compression

This method of handling I/O frees zlib from having to implement system dependent read and write code, and it insures that you can use the library to compress any sort of input stream, not just files. It's simply a matter of replacing the wrapper code shown above with a version customized for your data stream.

Wrapping it up

zlib's versatility is one of its strengths, but I don't always need all that flexibility. For example, to perform the simple file compression task Scott asked about at the start of this article, it would be nice to just be able to call a single function to compress a file, and another function to decompress. To make this possible, I created a wrapper class called zlibEngine.

zlibEngine provides a simple API that automates the compression and decompression of files and uses virtual functions to let you customize your user interface to zlib. The class definition is shown in its entirety in Figure 4. There are two different groups of members that are important to you in ZlibEngine. The first is the set of functions providing the calling interface to the engine. The second is the set of functions and data members used to create a user interface that is active during the compression process.

class ZlibEngine : public z_stream {
public :
ZlibEngine();
int compress( const char *input,
const char *output,
int level = 6 );
int decompress( const char *input,
const char *output );
void set_abort_flag( int i ){ m_AbortFlag = i; }
protected :
int percent();
int load_input();
int flush_output();
protected :
virtual void progress( int percent ){};
virtual void status( char *message ){};
protected :
int m_AbortFlag;
FILE *fin;
FILE *fout;
long length;
int err;
enum { input_length = 4096 };
unsigned char input_buffer[ input_length ];
enum { output_length = 4096 };
unsigned char output_buffer[ output_length ];
};

Figure 4
The ZlibEngine wrapper class

The Calling API

There are three C++ functions that implement the API needed to perform simple compression and decompression. Before using the engine, you must call the constructor, the first function. Since ZlibEngine is derived from the z_stream object used as the interface to zlib, the constructor is in effect also creating a z_stream object that will be used to communicate with zlib. In addition, the constructor initializes some of the z_stream member variables that will be used in either compression or decompression.

The two remaining functions are nice and simple: compress() compresses a file using the deflate algorithm. An optional level parameter sets a compression factor between 9 (maximum compression) and 0 (no compression.) decompress() decompresses a file, as you would expect. The compression level parameter isn't necessary when decompressing, due to the nature of the deflate algorithm. Both of these functions return an integer status code, defined in the zlib header file zlib.h. Z_OK is returned when everything works as expected. Note that I added an additional code, Z_USER_ABORT, used for an end user abort of the compression or decompression process.

The wrapper class makes it much easier to compress or decompress files using zlib. You only need to remember three things:

  • Include the header file for the wrapper class, zlibengn.h.
  • Construct a ZlibEngine object.
  • Call the member functions compress() or decompress() to do the actual work.

This means you can now perform compression with code this simple:

#include <zlibengn.h>

int foo()
{
ZlibEngine engine;
return engine.compress( "INPUT.DAT", "INPUT.DA_");
}

That's about as simple as you could ask for, isn't it?

The User Interface API

The calling API doesn't really make much of a case for creating the ZlibEngine class. Based on what you've seen so far, the compress() and decompress() functions don't really need to be members of a class. In theory, a global compress() function could just instantiate a z_stream object when called, without the caller even being aware of it.

The reason for creating this engine class is found in a completely different area: the user interface. It's really nice to be able to track the progress of your compression job while it's running. Conventional C libraries have to make do with callback functions or inflexible standardized routines in order to provide feedback, but C++ offers a better alternative through the use of virtual functions.

The ZlibEngine class has two virtual functions that are used to create a useful user interface: progress() is called periodically during the compression or decompression process, with a single integer argument that tells what percentage of the input file has been processed. status() is called with status messages during processing.

Both of these virtual functions have access to the ZlibEngine protected data element, m_AbortFlag. Setting this flag to a non-zero value will cause the compression or decompression routine to abort immediately. This easily takes care of another sticky user interface problem found when using library code.

Writing your own user interface then becomes a simple exercise. You simply derive a new class from ZlibEngine, and define your own versions of one or both of these virtual functions. Instantiate an object of your class instead of ZlibEngine, and your user interface can be as spiffy and responsive as you like!

Command line compression

I wrote a simple command line test program to demonstrate the use of class ZlibEngine. zlibtest.cpp does a simple compress/decompress cycle of the input file specified on the command line. I implement a progress function that simply prints out the current percent towards completion as the file is processed:

class MyZlibEngine : public ZlibEngine {
public :
void progress( int percent )
{
printf( "%3d%%\b\b\b\b", percent );
if ( kbhit() ) {
getch();
m_AbortFlag = 1;
}
}
};

Since class ZlibEngine is so simple, the derived class doesn't even have to implement a constructor or destructor. The derived version of progress() is able to provide user feedback as well as an abort function with just a few lines of code. zlibtest.cpp is shown in its entirety in Listing 1.

The OCX

To provide a slightly more complicated test of class ZlibEngine, I created a 32 bit OCX using Visual C++ 4.1. The interface to an OCX is defined in terms of methods, events, and properties. ZlibTool.ocx has the following interface:

Properties:

InputFile


OutputFile


Level


Status



Methods:

Compress()


Decompress()


Abort()



Events:

Progress()

(Note that I chose to pass status information from the OCX using a property, not an event.)

ZlibTool.ocx is a control derived from a standard Win32 progress bar. The progress care gets updated automatically while compressing or decompressing, so you get some user interface functionality for free. Using it with Visual Basic 4.0 or Delphi 2.0 becomes a real breeze. After registering the OCX, you can drop a copy of it onto your form and use it with a minimal amount of coding.

Both the source code for the OCX and a sample Delphi 2.0 program are available on the DDJ listing service. A screen shot of the Delphi program in action is shown in Figure 5.

Figure 5

The Delphi 2.0 OCX test program

Reference material

The source code that accompanies this article can be downloaded from this Web page. It contains the following source code collections:

  • The complete source for zlib
  • The Visual C++ 4.1 project for the ZlibTool OCX
  • The Delphi 2.0 project that exercises the OCX
  • The Console test program that exercises the ZlibEngine class

Each of the subdirectories contains a README.TXT file with documentation describing how to build and use the programs.

The source is split into two archives:

zlibtool.zip

All source code and the OCX file.

zlibdll.zip

The supporting MFC and VC++ DLLs. Many people will already have these files on their systems: MFC40.DLL, MSVCRT40.DLL, and OLEPRO32.DLL.

I haven't discussed the zlib code itself in this article. The best place to start gathering information about how to use zlib and the Info-ZIP products can be found on their home pages. Both pages have links to the most current versions of their source code as well:

Info-ZIP

http://www.info-zip.org

zlib

http://www.gzip.org/zlib

Once you download the Info-ZIP code, the quick start documentation is found in source file zlib.h. If you cook up any useful code that uses zlib, you might want to forward copies to Greg Roelofs for inclusion on the zlib home page. Greg maintains the zlib pages, and you can reach him via links found there.

Feel-good plug

zlib can do a lot more than just compress files. Its versatile interface can be used for streaming I/O, in-memory compression, and more. Since Jean-loup Gailly and Mark Adler were good enough to make this capable tool available to the public, it only makes sense that we take advantage of it. I know I have, and I encourage you to do the same.



swo 2006-08-18 16:23 鍙戣〃璇勮
]]>
ZLIB Compressed Data Format Specification version 3.3http://m.shnenglu.com/swo2006/articles/11407.htmlswoswoFri, 18 Aug 2006 06:40:00 GMThttp://m.shnenglu.com/swo2006/articles/11407.htmlhttp://m.shnenglu.com/swo2006/comments/11407.htmlhttp://m.shnenglu.com/swo2006/articles/11407.html#Feedback0http://m.shnenglu.com/swo2006/comments/commentRss/11407.htmlhttp://m.shnenglu.com/swo2006/services/trackbacks/11407.htmlZLIB Compressed Data Format Specification version 3.3

Status of This Memo

This memo provides information for the Internet community. This memo
does not specify an Internet standard of any kind. Distribution of
this memo is unlimited.

IESG Note:

The IESG takes no position on the validity of any Intellectual
Property Rights statements contained in this document.

Notices

Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly

Permission is granted to copy and distribute this document for any
purpose and without charge, including translations into other
languages and incorporation into compilations, provided that the
copyright notice and this notice are preserved, and that any
substantive changes or deletions from the original are clearly
marked.

A pointer to the latest version of this and related documentation in
HTML format can be found at the URL
<ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>.

Abstract

This specification defines a lossless compressed data format. The
data can be produced or consumed, even for an arbitrarily long
sequentially presented input data stream, using only an a priori
bounded amount of intermediate storage. The format presently uses
the DEFLATE compression method but can be easily extended to use
other compression methods. It can be implemented readily in a manner
not covered by patents. This specification also defines the ADLER-32
checksum (an extension and improvement of the Fletcher checksum),
used for detection of data corruption, and provides an algorithm for
computing it.

Table of Contents

1. Introduction ................................................... 2
1.1. Purpose ................................................... 2
1.2. Intended audience ......................................... 3
1.3. Scope ..................................................... 3
1.4. Compliance ................................................ 3
1.5. Definitions of terms and conventions used ................ 3
1.6. Changes from previous versions ............................ 3
2. Detailed specification ......................................... 3
2.1. Overall conventions ....................................... 3
2.2. Data format ............................................... 4
2.3. Compliance ................................................ 7
3. References ..................................................... 7
4. Source code .................................................... 8
5. Security Considerations ........................................ 8
6. Acknowledgements ............................................... 8
7. Authors' Addresses ............................................. 8
8. Appendix: Rationale ............................................ 9
9. Appendix: Sample code ..........................................10

1. Introduction

1.1. Purpose

The purpose of this specification is to define a lossless
compressed data format that:

* Is independent of CPU type, operating system, file system,
and character set, and hence can be used for interchange;

* Can be produced or consumed, even for an arbitrarily long
sequentially presented input data stream, using only an a
priori bounded amount of intermediate storage, and hence can
be used in data communications or similar structures such as
Unix filters;

* Can use a number of different compression methods;

* Can be implemented readily in a manner not covered by
patents, and hence can be practiced freely.

The data format defined by this specification does not attempt to
allow random access to compressed data.

1.2. Intended audience

This specification is intended for use by implementors of software
to compress data into zlib format and/or decompress data from zlib
format.

The text of the specification assumes a basic background in
programming at the level of bits and other primitive data
representations.

1.3. Scope

The specification specifies a compressed data format that can be
used for in-memory compression of a sequence of arbitrary bytes.

1.4. Compliance

Unless otherwise indicated below, a compliant decompressor must be
able to accept and decompress any data set that conforms to all
the specifications presented here; a compliant compressor must
produce data sets that conform to all the specifications presented
here.

1.5. Definitions of terms and conventions used

byte: 8 bits stored or transmitted as a unit (same as an octet).
(For this specification, a byte is exactly 8 bits, even on
machines which store a character on a number of bits different
from 8.) See below, for the numbering of bits within a byte.

1.6. Changes from previous versions

Version 3.1 was the first public release of this specification.
In version 3.2, some terminology was changed and the Adler-32
sample code was rewritten for clarity. In version 3.3, the
support for a preset dictionary was introduced, and the
specification was converted to RFC style.

2. Detailed specification

2.1. Overall conventions

In the diagrams below, a box like this:

+---+
| | <-- the vertical bars might be missing
+---+

represents one byte; a box like this:

+==============+
| |
+==============+

represents a variable number of bytes.

Bytes stored within a computer do not have a "bit order", since
they are always treated as a unit. However, a byte considered as
an integer between 0 and 255 does have a most- and least-
significant bit, and since we write numbers with the most-
significant digit on the left, we also write bytes with the most-
significant bit on the left. In the diagrams below, we number the
bits of a byte so that bit 0 is the least-significant bit, i.e.,
the bits are numbered:

+--------+
|76543210|
+--------+

Within a computer, a number may occupy multiple bytes. All
multi-byte numbers in the format described here are stored with
the MOST-significant byte first (at the lower memory address).
For example, the decimal number 520 is stored as:

0 1
+--------+--------+
|00000010|00001000|
+--------+--------+
^ ^
| |
| + less significant byte = 8
+ more significant byte = 2 x 256

2.2. Data format

A zlib stream has the following structure:

0 1
+---+---+
|CMF|FLG| (more-->)
+---+---+

(if FLG.FDICT set)

0 1 2 3
+---+---+---+---+
| DICTID | (more-->)
+---+---+---+---+

+=====================+---+---+---+---+
|...compressed data...| ADLER32 |
+=====================+---+---+---+---+

Any data which may appear after ADLER32 are not part of the zlib
stream.

CMF (Compression Method and flags)
This byte is divided into a 4-bit compression method and a 4-
bit information field depending on the compression method.

bits 0 to 3 CM Compression method
bits 4 to 7 CINFO Compression info

CM (Compression method)
This identifies the compression method used in the file. CM = 8
denotes the "deflate" compression method with a window size up
to 32K. This is the method used by gzip and PNG (see
references [1] and [2] in Chapter 3, below, for the reference
documents). CM = 15 is reserved. It might be used in a future
version of this specification to indicate the presence of an
extra field before the compressed data.

CINFO (Compression info)
For CM = 8, CINFO is the base-2 logarithm of the LZ77 window
size, minus eight (CINFO=7 indicates a 32K window size). Values
of CINFO above 7 are not allowed in this version of the
specification. CINFO is not defined in this specification for
CM not equal to 8.

FLG (FLaGs)
This flag byte is divided as follows:

bits 0 to 4 FCHECK (check bits for CMF and FLG)
bit 5 FDICT (preset dictionary)
bits 6 to 7 FLEVEL (compression level)

The FCHECK value must be such that CMF and FLG, when viewed as
a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG),
is a multiple of 31.

FDICT (Preset dictionary)
If FDICT is set, a DICT dictionary identifier is present
immediately after the FLG byte. The dictionary is a sequence of
bytes which are initially fed to the compressor without
producing any compressed output. DICT is the Adler-32 checksum
of this sequence of bytes (see the definition of ADLER32
below). The decompressor can use this identifier to determine
which dictionary has been used by the compressor.

FLEVEL (Compression level)
These flags are available for use by specific compression
methods. The "deflate" method (CM = 8) sets these flags as
follows:

0 - compressor used fastest algorithm
1 - compressor used fast algorithm
2 - compressor used default algorithm
3 - compressor used maximum compression, slowest algorithm

The information in FLEVEL is not needed for decompression; it
is there to indicate if recompression might be worthwhile.

compressed data
For compression method 8, the compressed data is stored in the
deflate compressed data format as described in the document
"DEFLATE Compressed Data Format Specification" by L. Peter
Deutsch. (See reference [3] in Chapter 3, below)

Other compressed data formats are not specified in this version
of the zlib specification.

ADLER32 (Adler-32 checksum)
This contains a checksum value of the uncompressed data
(excluding any dictionary data) computed according to Adler-32
algorithm. This algorithm is a 32-bit extension and improvement
of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073
standard. See references [4] and [5] in Chapter 3, below)

Adler-32 is composed of two sums accumulated per byte: s1 is
the sum of all bytes, s2 is the sum of all s1 values. Both sums
are done modulo 65521. s1 is initialized to 1, s2 to zero. The
Adler-32 checksum is stored as s2*65536 + s1 in most-
significant-byte first (network) order.

2.3. Compliance

A compliant compressor must produce streams with correct CMF, FLG
and ADLER32, but need not support preset dictionaries. When the
zlib data format is used as part of another standard data format,
the compressor may use only preset dictionaries that are specified
by this other data format. If this other format does not use the
preset dictionary feature, the compressor must not set the FDICT
flag.

A compliant decompressor must check CMF, FLG, and ADLER32, and
provide an error indication if any of these have incorrect values.
A compliant decompressor must give an error indication if CM is
not one of the values defined in this specification (only the
value 8 is permitted in this version), since another value could
indicate the presence of new features that would cause subsequent
data to be interpreted incorrectly. A compliant decompressor must
give an error indication if FDICT is set and DICTID is not the
identifier of a known preset dictionary. A decompressor may
ignore FLEVEL and still be compliant. When the zlib data format
is being used as a part of another standard format, a compliant
decompressor must support all the preset dictionaries specified by
the other format. When the other format does not use the preset
dictionary feature, a compliant decompressor must reject any
stream in which the FDICT flag is set.

3. References

[1] Deutsch, L.P.,"GZIP Compressed Data Format Specification",
available in ftp://ftp.uu.net/pub/archiving/zip/doc/

[2] Thomas Boutell, "PNG (Portable Network Graphics) specification",
available in ftp://ftp.uu.net/graphics/png/documents/

[3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification",
available in ftp://ftp.uu.net/pub/archiving/zip/doc/

[4] Fletcher, J. G., "An Arithmetic Checksum for Serial
Transmissions," IEEE Transactions on Communications, Vol. COM-30,
No. 1, January 1982, pp. 247-252.

[5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms,"
November, 1993, pp. 144, 145. (Available from
gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073.

4. Source code

Source code for a C language implementation of a "zlib" compliant
library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/.

5. Security Considerations

A decoder that fails to check the ADLER32 checksum value may be
subject to undetected data corruption.

6. Acknowledgements

Trademarks cited in this document are the property of their
respective owners.

Jean-Loup Gailly and Mark Adler designed the zlib format and wrote
the related software described in this specification. Glenn
Randers-Pehrson converted this document to RFC and HTML format.

7. Authors' Addresses

L. Peter Deutsch
Aladdin Enterprises
203 Santa Margarita Ave.
Menlo Park, CA 94025

Phone: (415) 322-0103 (AM only)
FAX: (415) 322-1734
EMail: <ghost@aladdin.com>

Jean-Loup Gailly

EMail: <gzip@prep.ai.mit.edu>

Questions about the technical content of this specification can be
sent by email to

Jean-Loup Gailly <gzip@prep.ai.mit.edu> and
Mark Adler <madler@alumni.caltech.edu>

Editorial comments on this specification can be sent by email to

L. Peter Deutsch <ghost@aladdin.com> and
Glenn Randers-Pehrson <randeg@alumni.rpi.edu>

8. Appendix: Rationale

8.1. Preset dictionaries

A preset dictionary is specially useful to compress short input
sequences. The compressor can take advantage of the dictionary
context to encode the input in a more compact manner. The
decompressor can be initialized with the appropriate context by
virtually decompressing a compressed version of the dictionary
without producing any output. However for certain compression
algorithms such as the deflate algorithm this operation can be
achieved without actually performing any decompression.

The compressor and the decompressor must use exactly the same
dictionary. The dictionary may be fixed or may be chosen among a
certain number of predefined dictionaries, according to the kind
of input data. The decompressor can determine which dictionary has
been chosen by the compressor by checking the dictionary
identifier. This document does not specify the contents of
predefined dictionaries, since the optimal dictionaries are
application specific. Standard data formats using this feature of
the zlib specification must precisely define the allowed
dictionaries.

8.2. The Adler-32 algorithm

The Adler-32 algorithm is much faster than the CRC32 algorithm yet
still provides an extremely low probability of undetected errors.

The modulo on unsigned long accumulators can be delayed for 5552
bytes, so the modulo operation time is negligible. If the bytes
are a, b, c, the second sum is 3a + 2b + c + 3, and so is position
and order sensitive, unlike the first sum, which is just a
checksum. That 65521 is prime is important to avoid a possible
large class of two-byte errors that leave the check unchanged.
(The Fletcher checksum uses 255, which is not prime and which also
makes the Fletcher check insensitive to single byte changes 0 <->
255.)

The sum s1 is initialized to 1 instead of zero to make the length
of the sequence part of s2, so that the length does not have to be
checked separately. (Any sequence of zeroes has a Fletcher
checksum of zero.)

9. Appendix: Sample code

The following C code computes the Adler-32 checksum of a data buffer.
It is written for clarity, not for speed. The sample code is in the
ANSI C programming language. Non C users may find it easier to read
with these hints:

& Bitwise AND operator.
>> Bitwise right shift operator. When applied to an
unsigned quantity, as here, right shift inserts zero bit(s)
at the left.
<< Bitwise left shift operator. Left shift inserts zero
bit(s) at the right.
++ "n++" increments the variable n.
% modulo operator: a % b is the remainder of a divided by b.

#define BASE 65521 /* largest prime smaller than 65536 */

/*
Update a running Adler-32 checksum with the bytes buf[0..len-1]
and return the updated checksum. The Adler-32 checksum should be
initialized to 1.

Usage example:

unsigned long adler = 1L;

while (read_buffer(buffer, length) != EOF) {
adler = update_adler32(adler, buffer, length);
}
if (adler != original_adler) error();
*/
unsigned long update_adler32(unsigned long adler,
unsigned char *buf, int len)
{
unsigned long s1 = adler & 0xffff;
unsigned long s2 = (adler >> 16) & 0xffff;
int n;

for (n = 0; n < len; n++) {
s1 = (s1 + buf[n]) % BASE;
s2 = (s2 + s1) % BASE;
}
return (s2 << 16) + s1;
}

/* Return the adler32 of the bytes buf[0..len-1] */

unsigned long adler32(unsigned char *buf, int len)
{
return update_adler32(1L, buf, len);
}



swo 2006-08-18 14:40 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩系列| 欧美一区深夜视频| 欧美激情视频在线播放| 亚洲免费黄色| 久久久伊人欧美| 午夜精品一区二区三区电影天堂| 国产日本精品| 国产精品一香蕉国产线看观看 | 免费在线观看精品| 亚洲精品中文字幕在线| 欧美日韩亚洲国产精品| 国产精品草莓在线免费观看| 欧美四级在线观看| 国产美女精品一区二区三区| 国产精品久久久久久久久久久久| 国产精品二区在线观看| 欧美性猛交99久久久久99按摩| 国产精品美女久久久免费| 国产偷国产偷亚洲高清97cao| 91久久久久久| 久久久久久尹人网香蕉| 亚洲高清视频在线观看| 日韩亚洲不卡在线| 久久精品国产一区二区三| 欧美成年视频| 国产欧美日韩在线播放| 亚洲人成免费| 亚洲欧美综合精品久久成人| 久久精品综合网| 亚洲人成在线观看| 欧美综合二区| 国产欧美日韩91| 99精品欧美一区二区三区综合在线| 欧美在线亚洲在线| 在线视频你懂得一区| 免费h精品视频在线播放| 国模叶桐国产精品一区| 性久久久久久久久| 在线一区视频| 国产精品美女在线| 亚洲深夜影院| 亚洲视频一区| 欧美视频一区二区三区…| 亚洲色在线视频| 欧美高清在线一区| 欧美福利视频在线| 蜜臀a∨国产成人精品| 亚洲免费电影在线| 免费看的黄色欧美网站| 欧美一区激情视频在线观看| 国产一二三精品| 男女av一区三区二区色多| 日韩午夜电影av| 亚洲欧美久久久| 国产精品一区毛片| 欧美专区中文字幕| 久久婷婷成人综合色| 亚洲第一色中文字幕| 一区二区三区国产在线| 国外成人在线视频| 一区二区国产精品| 欧美视频在线观看免费网址| 午夜国产欧美理论在线播放| 久久精品中文| 亚洲国产精品成人一区二区| 亚洲一本视频| 日韩一二三在线视频播| 国产亚洲午夜| 一区二区三区产品免费精品久久75 | 亚洲国产一区二区视频| 欧美日韩在线观看一区二区| 久久九九免费视频| 欧美日韩亚洲高清| 亚洲欧洲三级| 91久久线看在观草草青青| 久久av一区二区三区| 久久久久高清| 国产精品一区三区| 欧美一区二区女人| 玖玖视频精品| 亚洲国产婷婷香蕉久久久久久99 | 在线观看日韩精品| 欧美一区免费视频| 久久免费视频在线观看| 国产免费成人av| 久久成人免费日本黄色| 欧美一区二区免费视频| 欧美三级视频| 亚洲在线一区二区| 欧美一区二区三区免费在线看| 国产精品露脸自拍| 亚洲精品在线观| 欧美一区二区三区免费大片| 韩曰欧美视频免费观看| 久久久久久有精品国产| 亚洲精品中文字幕在线| 亚洲欧美久久| 亚洲第一狼人社区| 国产精品九九| 亚洲一区网站| 欧美大片免费看| 一区二区在线免费观看| 欧美成人三级在线| 艳女tv在线观看国产一区| 99国产精品视频免费观看一公开| 一区二区三区免费看| 国产精品理论片在线观看| 欧美大片一区| 久久久亚洲成人| 性做久久久久久免费观看欧美| 日韩视频免费看| 亚洲欧洲在线一区| 久久综合给合久久狠狠狠97色69| 中文在线不卡| 午夜精品久久久久久99热| 影视先锋久久| 亚洲精品久久久久久一区二区| 欧美日韩精品一区二区在线播放 | 小嫩嫩精品导航| 亚洲永久在线| 日韩亚洲欧美成人| 亚洲丝袜av一区| 久久久久久婷| 欧美va天堂va视频va在线| 欧美激情女人20p| 欧美日韩国产影片| 欧美性大战xxxxx久久久| 国产一区二区观看| 欧美成人激情视频| 99热在这里有精品免费| 亚洲欧美在线一区二区| 欧美专区在线观看一区| 亚洲尤物视频在线| 日韩亚洲一区在线播放| 欧美激情偷拍| 久久国产精品亚洲va麻豆| 亚洲黄色影片| 尤物在线精品| 狠狠色丁香久久综合频道| 国产欧美一区二区视频| 欧美护士18xxxxhd| 午夜日韩电影| 欧美亚洲综合久久| 欧美一级二区| 久久久久九九视频| 亚洲国产日韩一区| 一区二区三区在线观看视频| 国产精品av一区二区| 欧美日韩美女在线| 久久精品一区二区三区不卡| 亚洲国产精品久久| 欧美三级视频在线| 久久精品国产清自在天天线| 亚洲精品国产视频| 亚洲国产欧美国产综合一区 | 91久久黄色| 亚洲精品一区二区三区不| 欧美日韩一区二区三区在线看 | 欧美一区二区三区视频免费| 在线看欧美视频| 亚洲欧美成人一区二区三区| 亚洲综合精品| 久久综合狠狠| 亚洲一区二区在线观看视频| 久久夜精品va视频免费观看| 国产香蕉97碰碰久久人人| 一区二区三区高清在线| 亚洲精品欧美日韩专区| 亚洲素人在线| 欧美激情一区二区三区在线| 亚洲精美视频| 日韩小视频在线观看| 欧美二区在线看| 国产精品久久国产精品99gif| 合欧美一区二区三区| 亚洲天堂av在线免费观看| 亚洲高清一二三区| 久热精品视频在线| 久久免费少妇高潮久久精品99| 一区二区三区免费网站| 欧美日韩一区高清| 伊人精品在线| 亚洲国产99精品国自产| 91久久精品国产91久久| 午夜欧美大尺度福利影院在线看| 久久久久91| 亚洲视频专区在线| 亚洲手机视频| 在线视频你懂得一区二区三区| 噜噜噜在线观看免费视频日韩 | 欧美日本高清一区| 亚洲人成在线观看网站高清| 免费在线观看成人av| 一区二区欧美视频| 欧美视频第二页| 亚洲一区二区三区四区五区午夜 | 欧美丰满高潮xxxx喷水动漫| 国产精品永久免费| 欧美日韩国产小视频| 亚洲一区在线播放|