# Java CRC4校验

371人阅读 评论(1)

## 算法设计

① 循环计算，计算次数为扩大后的数据长度
② 如果数据首位不是0，分别将数据，特征码，校验首位所用的数据右移一位。否则执行③
③ 将特征码，校验 首位所用数据右移一位
④ 待求数如果小于0x10，跳出循环

## 全部代码

public class main {
private static final  short poly = 0x13;         //1 0011
/**
* 计算余数
* @param num 待检测序列
* @return  余数
*/
public static short getCrc(short num){

short extendPoly = (short) (poly << 9) ;                  //10 0110 0000 0000
short data = (short) (num << 4);     //待发送数据左移四位 11 0101 1011 0000
short detectNum = 0x2000;                   //校验首位  10 0000 0000 0000

String stringData = Integer.toBinaryString(data);         //转字符串，获取长度
for (int i = 0; i < stringData.length(); i ++){
String stringa = Integer.toBinaryString(data);
String stringb = Integer.toBinaryString(extendPoly);
if (data < 0x10){
break;
}else{
if((data & detectNum) != 0){
data = (short) (extendPoly ^ data);
System.out.println(stringa);

extendPoly  = (short) (extendPoly >> 1);
System.out.println(stringb);

System.out.println("---------------------");
detectNum = (short) (detectNum >> 1);
}else{
detectNum = (short) (detectNum >> 1);
extendPoly  = (short) (extendPoly >> 1);
System.out.println(stringa);
System.out.println(stringb);
System.out.println("---------------------");
}
}

}
String stringRemainder =  Integer.toBinaryString(data);
System.out.println("余数为："+stringRemainder);
return data;
}

/**
* 合成发送序列
* @param data  带传送数据
* @param remainder  余数
* @return  检验序列FCS
*/
public static short getFCS(short data,short remainder){

short FCS = (short) ((data << 4) + remainder);             //11 0101 1011 1110
String stringFCS =  Integer.toBinaryString(FCS);
System.out.println("\nFCS序列为:"+stringFCS+"\n");
return FCS;
}

/**
* 检测接收到的序列
*/
short extendPoly = (short) (poly << 9) ;                   //10 0110 0000 0000
short detectNum = 0x2000;                                  //校验首位  10 0000 0000 0000

for (int i = 0; i < stringFCS.length(); i ++){
String stringb = Integer.toBinaryString(extendPoly);
break;
}else{
System.out.println(stringa);

extendPoly  = (short) (extendPoly >> 1);
System.out.println(stringb);

System.out.println("---------------------");

detectNum = (short) (detectNum >> 1);
}else{
detectNum = (short) (detectNum >> 1);
extendPoly  = (short) (extendPoly >> 1);
System.out.println(stringa);
System.out.println(stringb);
System.out.println("---------------------");
}
}
}
System.out.println("没有差错,接收帧");
else {
System.out.println("出现差错,丢弃帧");
}
}

public static void main(String[] args) {
short num = 859;
String binaryString = Integer.toBinaryString(num);
System.out.println("输入数据为: "+binaryString+"\n");
short remainder = getCrc(num);

short FCS = getFCS(num,remainder);
checkFCS(FCS);

System.out.println("\n测试,改变CRC最后一位");
short errRemainder = 0xf;              //测试,改变最后余数最后一位
short testFcs = getFCS(num,errRemainder);
checkFCS(testFcs);
}
}

## 小结

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：373次
• 积分：16
• 等级：
• 排名：千里之外
• 原创：1篇
• 转载：0篇
• 译文：0篇
• 评论：1条
文章分类
文章存档
阅读排行
评论排行
最新评论