📄 decode.m
字号:
function result=decode(final,nf,low,high,mn)
%--------------------------------------------------------------------------
%此函数是解码过程
%基于算术编码的文本压缩,被main.m文件调用
%输出数组result是解码后的字符按字节顺序存储的数组
%--------------------------------------------------------------------------
m=length(final);%定义m是数组final的长度
r=1;%初始化r为1,它是数组result的当前长度
s=1;%初始化s为1,它是当前用于解码的数据在final中的位置
code=final(1);
%初始化code为final(1),它是正在用于解码的数据
qujian=1;%初始化qujian为1,把它和1e-5比较,
%判断是否提取final的下一个数据
lo=0;%初始化区间的下限lo是0
hig=1;%初始化区间的上限hig是1
remain=final(m);%定义remain是final的最后一个数据
while s<m-1|remain>0%当s不是final的最后一个可用于解码的数据或remain>0时执行循环
if s==m-1%如果s指向final的最后一个可用于解码的数据
remain=remain-1;%把remian减1
end
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中匹配的字符的位置
lo=low(k);%更新原来的下限值lo
hig=high(k);%更新原来的上限值hig
code=abs(code-lo)/(hig-lo);%根据公式,更新code
qujian=(hig-lo)*qujian;%把qujian的值还原为在原始区间[0,1)的子区间值
if qujian<mn&s<m-1%如果qujian小于mn并且s不指向最后一个压缩数据
s=s+1;%把s加1
code=final(s);%把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 + -