CRC校驗實現
阿新 • • 發佈:2019-01-27
1、實驗題目:CRC 校驗
PPP 協議受到資料幀後要對資料部分連同 FCS 欄位做 CRC 校驗,結果若不為“0”,則 可以肯定資料在傳輸過程中出錯;結果若為“0”,則只能說明很大概率上資料在傳輸的過程 中沒有出錯,而不是百分之百不出錯。這個概率與 CRC 校驗時採用的除數有關,我們把使 用某個除數做 CRC 校驗,結果為“0”且資料實際不出錯的概率稱為該除數的有效性。 本次試驗要求同學們以實驗的方法驗證 CRC-16
的有效性。
2、實驗內容
(1) 隨機取 1 個 128 位數 A。
(2) 將 A 與 CRC-16 做除法得餘數 B,A*216+B 儲存在 C 中。
(3) 隨機修改 C 中的 1 個位元,重新與 CRC-16 做除法運算,記錄餘數為 0 的二進位制組 合。
(4) 隨機修改 C 中的 2 個位元,重新與 CRC-16 做除法運算,記錄餘數為 0 的二進位制組 合。
(5) 隨機修改 C 中的 3 個位元,重新與 CRC-16 做除法運算,記錄餘數為 0 的二進位制組 合。
import java.util.Random; //import java.util.Arrays; public class CRC { public static int[] crc={1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1}; //crc-16碼,可修改 //生成一個n位的二進位制陣列,並自動補0 public static int[] BornBinary(int num,int crcNum) { int binary[]=new int[num+crcNum]; Random r=new Random(); for(int loop=0;loop<num;loop++) { binary[loop]=r.nextInt(2); } for(int loop=num;loop<num+crcNum;loop++) { binary[loop]=0; } return binary; } //獲取冗餘碼FCS,n為crc碼的位數 public static int[] remainderGet(int[] binary,int n) { int[] remainder=new int[n]; for(int loop=0;loop<n;loop++) //初始化 { remainder[loop]=binary[loop]; } for(int loop=n;loop<binary.length;loop++) //迴圈 { if(remainder[0]==0) //如果上次模二運算結果的首位為0,則跳過該次運算 { } else { for(int loopA=0;loopA<n;loopA++) { remainder[loopA]=remainder[loopA]^crc[loopA]; } } move(remainder,n-1); //左移陣列 remainder[n-1]=binary[loop]; //將數字的下一位補入陣列 } for(int loopA=0;loopA<n;loopA++) //最後一次模二運算,獲得最終的FCS碼 { remainder[loopA]=remainder[loopA]^crc[loopA]; } move(remainder,n-1); return remainder; } //陣列從第二位開始的n位左移一位 public static int[] move(int[] remainder,int n) { for(int loop=0;loop<n;loop++) { remainder[loop]=remainder[loop+1]; } return remainder; } //輸出陣列的前n位 public static void show(int[] binary,int n) { for(int loop=0;loop<n;loop++) { System.out.print(binary[loop]); } System.out.println(); } public static void main(String[] args) { int[] binary=BornBinary(128,16); show(binary,128); int[] temp=remainderGet(binary,17); show(temp,16); for(int loop=0;loop<16;loop++) { binary[loop+128]=temp[loop]; } temp=remainderGet(binary,17); show(temp,16); } }