计算一个文件的16位效验和——matlab语言的实现

            前些日子刚好做了一个计算一个文件的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>


 

 

结果截图:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 

 

前面三个英语的应该没什么问题,只是最后一个是汉字的文件,我不知道这个结果是否正确,希望有兴趣或者说知道正确与否朋友能够告诉我一下。

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值