前些日子刚好做了一个计算一个文件的16位校验和的计网实验,本来要求是用C++写的,后来觉得太麻烦了,想起了一年前自学了一段时间的matlab,然后就想到用matlab来处理计算可能会方便一些(其实就是觉得C++处理起来有些麻烦),于是就抱着试一试的心态,结果就成功了。
看一下题目: 编写一个计算机程序用来计算一个文件的16位效验和。最快速的方法是用一个32位的整数来存放这个和。记住要处理进位(例如,超过16位的那些位),把它们加到效验和中。
下面就直接贴出源码,有错误或有更好的建议欢迎大家评论哈!!!
<span style="font-size:14px;">clc
clear
fid = fopen('C:\Users\Administrator.WIN-20141115YKS\Desktop\网络\text.txt','rt'); %打开文档
decdata=fread(fid); %读取文件号
decdata = decdata' %转置矩阵
bindata = arrayfun(@(x)dec2bin(x,8),decdata,'UniformOutput',false); %进制矩阵转二进制矩阵
%注意matlab中的二进制数的表示,如10001,需要表示成 '10001' , 再如bin2dec(10001),这是错误的,要表示成bin2dec('10001')
%[row,col] = size(bindata);
%计算文件长度
fseek(fid,0,'eof');
filelength=ftell(fid);
%定义全局变量
global sum carry;
sum=0;
carry=0; %计算进位
temp = mod(filelength,2); %判断文件长度是奇数还是偶数,temp=0,表示文件长度为偶数,用temp返回值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
j = 1; %注意,matlab的数列下标是从1开始,不是C或C++的从0开始
if temp == 0 %表示文件长度为偶数,不用加0
%每两个二进制数合并成一个
for i = 1 : 2 : col %从1开始,将第一个与第二个合并,第三个与第四个合并,以此类推,i=1,3,5,7......
str(j) = strcat(bindata(i),bindata(i+1)); %str为合并后的数组
j = j + 1;
end
str
%合并后的二进制数转十进制
decdata = bin2dec(str)';
[row1,col1] = size(decdata);
decdata
for i = 1 : col1
sum = sum + decdata(i);
if sum > 65536 %2^16
sum = sum - 65536;
carry = carry + 1;
end
end
sum = sum + carry;
end
%当文件长度为奇数时,文件末尾加0
if temp == 1
%每两个二进制数合并成一个
for i = 1 : 2 : col-1 % 因为文件长度为奇数,所以先合并到倒数第二个元素,再在最后一个元素的后面添加'00000000',这样就不用在文件里面加0了
str(j) = strcat(bindata(i),bindata(i+1));
j = j + 1;
end
str(j) = strcat(bindata(col),'00000000'); %补0凑够16位二进制数
str
%合并后的二进制数转十进制
decdata = bin2dec(str)';
[row1,col1] = size(decdata);
decdata
for i = 1 : col1
sum = sum + decdata(i);
if sum > 65536 %2^16 16位整数的最大值,大于这个值就进1,carry 加 1。
sum = sum - 65536;
carry = carry + 1;
end
end
sum = sum + carry;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%carry
dec2hex(sum)
frewind(fid);
fclose(fid); %注意要关闭文件</span>
结果截图:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
前面三个英语的应该没什么问题,只是最后一个是汉字的文件,我不知道这个结果是否正确,希望有兴趣或者说知道正确与否朋友能够告诉我一下。