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

}


发布了12 篇原创文章 · 获赞 4 · 访问量 2563

猜你喜欢

转载自blog.csdn.net/xiayu729100940/article/details/78545898