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