1. 程式人生 > >CRC校驗實現

CRC校驗實現

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);
	}

}