注:哈夫曼和lzss算法不是同一种算法,先用哈夫曼再用lzss算法压缩后会发现经哈夫曼压缩后再用lzss压缩文件会变大,具体原因不明
lzss原理:
把编码位置置于输入数据流的开始位置。
在前向缓冲器中查找窗口中最长的匹配串
①
pointer
:=匹配串指针。
②
length
:=匹配串长度。
判断匹配串长度length是否大于等于最小匹配串长度(min_length)
,
如果“是”:输出指针,然后把编码位置向前移动length个字符。
如果“否”:输出前向缓冲存储器中的第1个字符,然后把编码位置向前移动一个字符。
如果前向缓冲器不是空的,就返回到步骤2。
例:编码字符串如表03-05-3所示,编码过程如表03-05-4所示。现说明如下:
“步骤”栏表示编码步骤。
“位置”栏表示编码位置,输入数据流中的第1个字符为编码位置1。
“匹配”栏表示窗口中找到的最长的匹配串。
“字符”栏表示匹配之后在前向缓冲存储器中的第1个字符。
“输出”栏的输出为:
①
如果匹配串本身的长度length
>=
min_length,输出指向匹配串的指针,格式为(back_chars,
chars_length)。该指针告诉译码器“在这个窗口中向后退back_chars个字符然后拷贝chars_length个字符到输出”。
②
如果匹配串本身的长度length
>=
min_length,则输出真实的匹配串。
表:输入数据流
位置
1 2 3 4 5 6 7 8 9 10 11
字符
a a b b c b b a a b c
表:编码过程(min_length
=
2)
步骤 位置 匹配串 输出
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