CRC校验实现

来源:互联网 发布:mac系统语言切换 编辑:程序博客网 时间:2024/04/30 06:30

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位的二进制数组,并自动补0public 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);}}