LZW

来源:互联网 发布:衡水淘宝摄影 编辑:程序博客网 时间:2024/06/06 18:34

LZW编码

(A)下面给出GIF-LZW编码的编码过程。它的示意代码如下所示:

//初始化字串表

InitializeStringTable();

//输出LZW_CLEAR

WriteCode(LZW_CLEAR);

//初始化保留字串Ω为空

Ω=NULL

//对输入的每个字符循环操作

For each character in the input stream

{//获取下一个字符串

   K=GetNextCharacter();

  //判断Ω+k是否在字串表中

  If Ω+k is in string table

{//将Ω赋值为Ω+k;

Ω=Ω+k;}

else

{//Ω+k不在字串表中

 //输出字符串Ω的编码

   WriteCode(CodeFormString(Ω));

 //将Ω添加到字串表中

 AddTabEntry(Ω);

//将Ω赋值为k

Ω=k

}

}

//输出字符串Ω的编码

WriteCode(CodeFormString(Ω));

//输出结束标志

WriteCode(LZW_EOI);

 

通过一个示例说明上述编码过程。假设有一个长度为9的输入字符串:BBBCCBBAA,其编码过程如下:

首先,字串表初始化为:

1

索引

0x000

0x000

0x001

0x000

0x002

0x000

0x003

0x000

……

……

0x041

0x041  (A)

0x042

0x041  (B)

0x043

0x041  (C)

0x044

0x041  (D)

……

……

0x0FE

0x0FE

0x0FF

0x0FF

0x100

LZW_CLEAR

0x101

LZW_EOI

 

按照上面的流程,首先应该输出LZW_CLEAR的编码(即LZW_CLEAR在字串表中的索引0x100),并初始化保留字符串Ω为空。

接着读出下一个字符“B”。因为Ω+B=B已经存在于字符串中,因此本步将不输出任何编码,而只是将Ω赋值为“B”。

接着读入下一个字符“B”。因为字串表中不存在字符串Ω+B=BB,因此输出Ω=B在字串表中的编码(索引)0x042,并将Ω赋值为新读入的字符“B”,同时现字串表尾部中添加一个字串“BB”,其索引为0x102

接着读入第4个字符“C”。因为字串表中不存在字符串Ω+C=BBC,因此输出Ω=C在字串表中的编码(索引)0x102,并将Ω赋值为新读入的字符“C”,同时现字串表尾部中添加一个字串“BBC”,其索引为0x103

接着读入第5个字符“C”。因为字串表中不存在字符串Ω+C=CC,因此输出Ω=C在字串表中的编码(索引)0x043,并将Ω赋值为新读入的字符“C”,同时现字串表尾部中添加一个字串“CC”,其索引为0x104

接着读入第6个字符“B”。因为字串表中不存在字符串Ω+B=CB,因此输出Ω=C在字串表中的编码(索引)0x043,并将Ω赋值为新读入的字符“B”,同时现字串表尾部中添加一个字串“CB”,其索引为0x105

接着读入第7个字符“B”。因为Ω+B=BB已经存在于字串表中,因此本步将不输出任何编码,而只是将Ω赋值为“BB”。

接着读入第8个字符“A”。因为字串表中不存在字符串Ω+A=BBA,因此输出Ω=BB在字串表中的编码(索引)0x102,并将Ω赋值为新读入的字符“A”,同时现字串表尾部中添加一个字串“BBA”,其索引为0x106

接着读入第9个字符“A”。因为字串表中不存在字符串Ω+A=AA,因此输出Ω=A在字串表中的编码(索引)0x041,并将Ω赋值为新读入的字符“A”,同时现字串表尾部中添加一个字串“AA”,其索引为0x107

现在输入字符串全部读完,直接输出Ω=A在字串表中的编码(索引)0x41

然后在输出LZW_EOI的编码0x101,编码完成。下表列出上述完整的编码过程。

             2

输入数据

输出结果

保留字符串值

添加的字串及其在字串表中的索引

 

0x100

Ω=NULL

 

B

 

Ω=B

 

B

0x042

Ω=B

0x102   BB

B

 

Ω=BB

 

C

0x102

Ω=C

0x103   BCB

C

0x043

Ω=C

0x104   CC

B

0x043

Ω=B

0x105   CB

B

 

Ω=BB

 

A

0x102

Ω=A

0x106  BBA

A

0x041

Ω=A

0x107  AA

 

0x041

 

 

 

0x101

 

 

 

(B) 下面给出GIF-LZW编码的解码过程,它的示意代码如下所示:

      //依次处理每个编码

While ((Code=GetNextCode())!=LZW_EOI)

{//判断是否是LZW_CLEAR

  If (Code ==LZW_CLEAR);

{//初始化字串表

 InitializeStringTable();

//获取下一个编码

Code=GetNextCode();

//判断是否是LZW_CLEAR

If (Code !=LZW_CLEAR);

{//输出编码对应的字符串

  WriteString(StringFormCode(Code));

   //更新OldCode

OldCode=Code;

}

}

else

{//判断字串表中是否存在该Code

   If (IsInTable(Code))

{//在字串表中

  //输出编码对应的字符串

WriteString(StringFormCode(Code));

//添加字符串入字串表

AddStringToTable(StringFormCode(OldCode)+GetFirstChar(StringFormCode(Code)));

//更新OldCode

OldCode=Code;

}

Else

{//不在字串表中

//计算输出字符串

OutString=StringFormCode(OldCode)+GetFirstChar(StringFormCode(OldCode));

//输出字符串

WriteString(OutString);

//添加字符串入字串表

AddStringToTable(OutString);

//更新OldCode

OldCode=Code;

}

}

}

首先读取第一个编码Code=0x100,由于CodeLZW_CLEAR,因此要对字串表进行初始化。初始化结果如表1所示。接着在读取下一个编码Code=0x042,它不等于LZW_CLEAR,因此输出该编码对应的字符串“B”,同时更新OldCodeCode(OldCode=0x042).

读取下一个(第3个)编码Code=0x102,由于该编码对应的字符串还没有生成(IsInTable(Code)返回False,需要先生成该字符串OutString::等于OldCode对应的字符串(B)加上该字符串的第一个字符,因此Outstring=BB.输出该字符串,同时将该字符串BB添加到字符串中(其索引为0x102),更新OldCodeCode(OldCode=0x102)

读取下一个(第4个)编码Code=0x043它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“C”然后将OldCode对应的字符串(BB)加上该字符串第一个字符(C)添加到字串表中(字符串BBC,其索引为0x103,同时更新OldCodeCode(OldCode=0x043)

读取下一个(第5个)编码Code=0x043它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“C”然后将OldCode对应的字符串(C)加上该字符串第一个字符(C)添加到字串表中(字符串CC,其索引为0x104,同时更新OldCodeCode(OldCode=0x043)

读取下一个(第6个)编码Code=0x012它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“BB”然后将OldCode对应的字符串(C)加上该字符串第一个字符(B)添加到字串表中(字符串CB,其索引为0x105,同时更新OldCodeCode(OldCode=0x102)

读取下一个(第7个)编码Code=0x041它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“A”然后将OldCode对应的字符串(BB)加上该字符串第一个字符(A)添加到字串表中(字符串BBC,其索引为0x106,同时更新OldCodeCode(OldCode=0x041)

读取下一个(第8个)编码Code=0x041它不等于LZW_CLEAR,而且字串表存在该索引,因此输出该编码对应的字符串“A”然后将OldCode对应的字符串(A)加上该字符串第一个字符(A)添加到字串表中(字符串AA,其索引为0x107,同时更新OldCodeCode(OldCode=0x041)

读取最后一个(第9个)编码Code=0x101,它等于LZW_EOI,表明数据已经完全解码,结束循环。其解码过程如下:

表3

输入数据

输出数据

保留编码值

添加的字串及其在字串表中的索引

0x100

 

 

 

0x042

B

OldCode=0x041

 

0x102

BB

OldCode=0x102

0x102   BB

0x043

C

OldCode=0x043

0x103   BBC

0x043

C

OldCode=0x043

0x104   CC

0x102

BB

OldCode=0x102

0x105   CB

0x041

A

OldCode=0x041

0x106   BBA

0x041

A

OldCode=0x041

0x107   AA

0x101

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击