文章目录
实验目的
掌握词典编码的基本原理,用C/C++/Python等语言编程实现LZW解码器并分析编解码算法。
LZW编解码原理
编码0-255用来存储Ascii码为[0,255]的字符,放在字典里。
编码从256开始,将出现过的字符计入字典
核心思想:利用字符的可重用性,每当往结果输出一个编码,就将一个新的string存入dictionary
实验内容
1.首先调试LZW的编码程序,以一个文本文件作为输入,得到输出的LZW编码文件。
2. 以实验步骤一得到的编码文件作为输入,编写LZW的解码程序。在写解码程序时需要对关键语句加上注释,并说明进行何操作。在实验报告中重点说明当前码字在词典中不存在时应如何处理并解释原因。
3. 选择至少十种不同格式类型的文件,使用LZW编码器进行压缩得到输出的压缩比特流文件。对各种不同格式的文件进行压缩效率的分析。
实验文件
1.文本文件
2.图像文件
实验步骤
输入文件,输出LZW编码文件
#LZW编码
def LZW(InFileName,OutFileName):
f = open(InFileName,'rb') #读取对应的文件
string = f.read()
string = string.decode("utf-8")
f.close()
print("压缩前的编码:",string)
dictionary = {
chr(i): i for i in range(0, 256)}#导入ASC码进入字典1
last = 256#新的编码从第256位开始
p = ""#定义前一个字符,开始为空
result1 = []#定义一个空数组作为编码输出
for c in string: #c为后一个字符,如果c在字符串中执行循环,执行完一次后c指向下一个字符
pc = p + c #将前后两个字符组成一个新的字符用pc表示
if pc in dictionary: #如果pc在字典中,把pc作为前一个字符
p = pc
else:
result1.append(dictionary[p]) #如果pc不在字典中,把前一个