lzw的思想通過一系列編號來代替短語,再次遇到此短語是用編號來替代,以此來達到壓縮的目的。由於詞典的構建過程固定故不需要傳詞典,解決了碼表傳輸的問題。解碼時在解碼端重建詞典即可進行解碼。
lzw編碼演算法的步驟如下:
步驟1:將詞典初始化為包含所有可能的單字元,當前字首p初始化為空。
步驟2:當前字元c=字元流中的下乙個字元。
步驟3:判斷p+c是否在詞典中
(1)如果「是」,則用c擴充套件p,即讓p=p+c,返回到步驟2。
(2)如果「否」,則
輸出與當前字首p相對應的碼字w;
將p+c新增到詞典中;
令p=c,並返回到步驟2
由於個人水平問題,這次編碼的**使用的是老師已經給出的,包括位輸入輸出工具及各子函式,不做展示,每個函式的作用及返回值會在解碼的**裡中標註
解碼的步驟如下:
在開始解碼時詞典包含所有可能的字首根;
步驟2:令cw:=碼字流中的第乙個碼字;
步驟3:輸出當字首-符串string.cw到碼字流;
步驟4:先前碼字pw:=當前碼字cw;
步驟6:判斷當字首-符串string.cw 是否在詞典中;
(1)如果」是」,則把當字首-符串string.cw輸出到字元流;
當前字首p:=先字首-符串string.pw;
當前字元c:=當前字首-符串string.cw的第乙個字元;
把綴-符串p+c新增到詞典;
(2)如果」否」,則當前字首p:=先字首-符串string.pw。
當前字元c:=當字首-符串string.cw的第乙個字元。
輸出綴-符串p+c到字元流,然後把它新增到詞典中。
7.步驟7:判斷碼字流中是否還有碼字要譯。
(1)如果」是」,就返回步驟4。
(2)如果」否」,結束。
**如下
#define _crt_secure_no_warnings
#include #include "bitio.h"
#define max_code 65535
struct dictionary[max_code+1];//字典
int next_code;
int d_stack[max_code]; //存放解碼端解出字串的陣列,decodestring函式解出的字串的編號會放在這
void lzwdecode( bitfile *bf, file *fp)
else//如果不是第乙個字元
{ if (buffer[i] < next_code)//如果當前詞條編號在字典裡
{int sibling = 0;
phrase_length = decodestring(0, buffer[i]);//解出字串,返回字元長度
for (int j = phrase_length-1; j < phrase_length; j--)
{sibling=indictionary(d_stack[j], last_code);//檢視由目前字首和剛解出的詞條的第乙個字元組成的詞條是否在字典裡(真繞),不在會返回-1,否則返回索引號
if (sibling == -1)//如果不在
{addtodictionary(d_stack[j], last_code);//將這個詞條寫入詞典
for(int n=0;n這是壓縮前的文字
這是壓縮後的檔案
這是解碼後的檔案
LZW編譯碼演算法實現與分析
題目 lzw編譯碼原理和實現演算法 part1.lzw編碼原理和實現演算法 lzw的編碼思想是不斷地從字元流中提取新的字串,通俗地理解為新 詞條 然後用 代號 也就是碼字表示這個 詞條 這樣一來,對字元流的編碼就變成了用碼字去替換字元流,生成碼字流,從而達到壓縮資料的目的。lzw編碼是圍繞稱為詞典的...
編譯碼 關於base64編碼的原理及實現
自 base64 base64的編碼都是按字串長度,以每3個8bit的字元為一組,然後針對每組,首先獲取每個字元的ascii編碼,然後將ascii編碼轉換成8bit的二進位制,得到一組3 8 24bit的位元組 然後再將這24bit劃分為4個6bit的位元組,並在每個6bit的位元組前面都填兩個高位...
用python實現的LZW演算法
以前學習了一下gif的lzw演算法,不過只是學習了一下 見我以前的那篇博文 lzw for gif演算法原理和實現 沒有實踐,也沒有看看效果到底怎麼樣,因為現在zip庫很多,基本上不需要自己寫壓縮演算法了,lzw的壓縮效果也比不上它們。不過最近有個嵌入式系統上的資料記錄需求,希望把執行過程中採集的資...