crc编码
crc编码 int型变量,可用32位
代码:
package crc;
import java.math.BigInteger;
import java.util.Scanner;
public class CRC {
public static void main(String[] args) {
System.out.println("请输入二进制数据: ");
Scanner sc = new Scanner(System.in);
String dataStr = sc.next();
System.out.println("请输入多项式系数: ");
String gxStr = sc.next();
sc.close();
//获取二进制帧的位数
int dataStrLen = dataStr.length();
//获取多项式位数
int gxStrLen = gxStr.length();
//将二进制的字符串变为整型
int data = Integer.parseInt(dataStr,2);
//将多项式的字符串变为整型
int gx = Integer.parseInt(gxStr,2);
//算出原始数据补零后的总位数
int sum = dataStrLen+gxStrLen-1;
//计算2的sum-1次幂
BigInteger bi = new BigInteger("2");
//将2的sum-1次幂转换为int型
int flag = bi.pow(sum-1).intValue();
//原始帧低位补零
System.out.println("data:"+Integer.toBinaryString(data));
data =data<<(gxStrLen-1);
System.out.println("补零后:\ndata:"+Integer.toBinaryString(data));
//多项式低位补零,使其与补零后的帧位数一致,以便异或
System.out.println("gx:"+Integer.toBinaryString(gx));
gx = gx<<(dataStrLen-1);
System.out.println("补零后:\ngx :"+Integer.toBinaryString(gx));
//循环dataStrLen次
for(int i=0; i<(dataStrLen);i++){
//判断补零后的帧最高位为1还是零
if((data&flag)!=0) {
data = data^gx;
gx = gx>>1;
}else {
gx = gx>>1;
}
//flag最高位的1右移
flag = flag>>1;
}
String crc = Integer.toBinaryString(data);
//解决Java输出二进制时略去高位零的问题
while(crc.length()<(gxStrLen-1)) {
crc = "0"+crc;
}
System.out.println("冗余码:"+crc);
}
}
计算结果:
注意事项:
将输入的二进制字符串根据二进制改为整数
int data = Integer.parseInt(dataStr,2);