📄 decode.asv
字号:
function result=decode(final,m,nf,low,high,mn,f)
%--------------------------------------------------------------------------
%此函数是解码过程
%基于算术编码的文本压缩,被main.m文件调用
%输出数组result是解码后的字符按字节顺序存储的数组
%--------------------------------------------------------------------------
r=1;%初始化r为1,它是数组result的当前长度
s=1;%初始化s为1,它是当前用于解码的数据在final中的位置
remain=fix(final(1));%定义remain是final的最后一个数据
code=final(1)-remain;%初始化code为final(1),它是正在用于解码的数据
qujian=final(1)-fix(final(1)*mn);%初始化qujian为1,把它和1e-5比较,判断是否提取final的下一个数据
while remain>0%当s不是final的最后一个可用于解码的数据或remain>0时执行循环
remain=remain-1;
% fprintf('\nr:%4.0f\n',r);fprintf('remain:%4.0f\n',remain);fprintf('qujian:%12.16f\n',qujian);fprintf('code :%12.16f\n',code);
sign=0;%初始化标志位sign为0,表示未找到匹配的字符
k=1;%初始化k为1
while sign==0%当sign为0时,执行循环
if code>=low(k)-1e-10%找到这样一个区间,满足high(k)>code>=low(k)
result(r)=nf(k);%把nf的地k个字符作为result的第个字符
r=r+1;%把加1,即把result的长度加1
sign=1;%把sign置1,表示找到这样的区间
else
k=k+1;%否则,把k加1,继续往后找
end
end%结束循环时,k是数组nf中匹配的字符的位置
% fprintf('k:%8.0f\n',k);fprintf('s:%8.0f\n',s);fprintf('low :%12.16f\n',low(k));fprintf('high :%12.16f\n',high(k));
lo=low(k);
hig=high(k);
code=abs(code-lo)/(hig-lo);%根据公式,更新code
qujian=(hig-lo)*qujian;%把qujian的值还原为在原始区间[0,1)的子区间值
% fprintf('qujian:%12.16f\n',qujian);fprintf('nmn:%12.16f\n',nmn);
if remain==0&s<m%如果qujian小于mn并且s不指向最后一个压缩数据
s=s+1;%把s加1
remain=fix(final(s));
code=final(s)-remain;%把code定义为final的第s个数据
qujian=1;%把qujian还原为初始值1
lo=0;hig=1;%恢复下限和上限为初始值0和1
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -