fid_input=fopen('input.txt');%读入文档
fid_code=fopen('LZWcode.txt','w');
fid_output=fopen('output.txt','w');%用于输出文档
D=fscanf(fid_input,'%c');%扫描文档
D_Length=size(D,2);%文档长度
max=2;%最大扫描长度
pin=1;%指针,判断输出位置
dict={};%字典
%前256ASCII码表
for i=1:256
dict{i,1}=i;
dict{i,2}=char(i);
end
%编码&字典
dictL=size(dict,1);%字典初始长度
id=1;%目前指向字符位置
%1位字符的均已包括在ASCII码中
while(id<D_Length)%当字符位置小于字长时
%由最大扫描长度减1至1,因为输入编码为已存在字符的长度加m
for m=(max-1):-1:1
temp=D(id:(id+m-1));%临时存储字符
[jg,t]=judge(temp,dictL,dict);%判断字典是否存在相同字符
if (jg==1)%若存在
output(1,pin)=t;%输出编码
pin=pin+1;%输出指针加1
%当字符指针小于文档长度时,用于防止当字符指向末尾时溢出
if id+m<D_Length
dictL=dictL+1;%字典长度加1
dict{dictL,1}=dictL;%输入新码
%内容为在原字典中能寻找到的字符位置加m的字符
temp1=D(id:id+m);
dict{dictL,2}=temp1;
end
id=id+m;%更新位置
break;%跳出
end
end
end
fprintf(fid_code,'%d',output);%输出编码后的数据
%译码
input=output;%输入序列进行译码
encodeL=length(input);%译码长度为输入码长
encode=char();%译码字符空间
ec=1;%译码指针
for i=1:encodeL
se=output(i);%临时存储码字
[jg2,j]=judge2(se,dictL,dict);%判断码字对应的字典符号
ecL=length(dict{j,2});%对应的符号长度
encode(ec:ec+ecL-1)=dict{j,2};%在对应长度区间内输出字符
ec=ec+ecL;%更新指针
end
fprintf(fid_output,'%c',encode);%输出字符到指定文档
fclose(fid_input);%关闭文档
fclose(fid_code);
fclose(fid_output);
%寻找字典中是否有与输入符号相对应的符号,比较字符串
function [jg,t]=judge(temp,dictL,dict)
for t=1:dictL
jg=strcmp(temp,dict{t,2});%字典第二列,比较字符串
if jg==1%有则为1
break;%退出,返回对应码值
end
end
end
%寻找码字对应的字符,得到的是字典的码字
% function [jg2,j]=judge2(se,dictL,dict)
% for j=1:dictL
% jg2=find(se==dict{j,1});%比较数值
% if jg2==1%数值相等为1
% break;
% end
% end
% end
评论0