📄 lm_huffman.m
字号:
%my_huffman.m
clear all;
[FileName,PathName] = uigetfile('*.txt','Select the TXT-file');
TXTFile = strcat(PathName,FileName);
number = zeros(256,1);
charN = 0;
fid = fopen(TXTFile,'r');
while 1
% tline = fgetl(fid); %一次读入一行
tline = fread(fid,1); %输出自动为数字
if isempty(tline),
break,
end
number(tline+1) =1 + number(tline+1);
%该字符对应的charHist元素加1,最终是它的总个数
%disp(tline)
end
fclose(fid);
charN = sum(number); %字符总数
fprintf('\n原文件大小为:%d字节',charN);
code1 = find(number(:)~=0);%查找在文件中存在的字符对应的ASCII码编号(从1开始计)
pHist = number(code1);
pHist = pHist./sum(pHist);
codeASCII = code1-1;%将sy内的ASCII编号改为从0计
%-------------------------------------------%
dicts = huffmandict(codeASCII,pHist);
fc=cell(256,1);
[m,n] = size(dicts);
for i=1:m;
[dex,code]=dicts{i,:};
fc{dex+1}=code;
end
%------------------------------------%
result=[];
fid_r = fopen(TXTFile,'r');
fid_w = fopen('output.dat','w');
while 1
tline = fread(fid_r,1); %输出自动为数字
if isempty(tline),
break,
end
code = fc{tline+1,:}; %读入的字符对应的编码
code_int8 = int8(code);
result=[result,code_int8];
fwrite(fid_w,code_int8);
%disp(tline)
end
fclose(fid_r);
fclose(fid_w);
codeN=length(result);
fprintf('\n编码后序列总长度为%d,文本总大小为%d字节',codeN,ceil(codeN/8));
fprintf('\n压缩比%.4f.\n',charN/(codeN/8));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -