1. 程式人生 > >計算一個檔案的16位效驗和——matlab語言的實現

計算一個檔案的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>


結果截圖:

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

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

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

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

前面三個英語的應該沒什麼問題,只是最後一個是漢字的檔案,我不知道這個結果是否正確,希望有興趣或者說知道正確與否朋友能夠告訴我一下。