本人之前没接触过硬件 但是没办法 谁叫是 员工呢 老板指哪打哪啊 主要是今天和 硬件厂商对接设备 问题是 我要往对方发送命令 和接受 对方的返回信息 都要做CRC校验 信息的准确性 废话不多说 直接放代码 CRC算法原理我就不多说了
public class JavaCrc16 {
/**
*
* @param chars
* @param len 设置你想要算到哪个位置的 CRC
* 比如 chars 是 8个元素 len为4那只会算前四个的CRC码
* 如果写8 那就是全部字节 的CRC码
* @return
*/
public static int crc16(int[] chars,int len){
int crc = 0xFFFF;
int j =0;
while (j<len){
crc ^= chars[j];
for(int f=0;f<8;f++){
if((crc&0x0001)!=0){
crc>>=1;
crc ^= 0xC9DA;
}else {
crc >>= 1;
}
}
j++;
}
return((crc & 0xFF) * 0x100 + (crc / 0x100));
}
/**
* @param strings
* @return
*/
public static int[] convert(String[] strings){
int[] ints = new int[strings.length];
int len = strings.length;
for(int i =0;i<len;i++){
ints[i] = Integer.parseInt(strings[i],16);
}
return ints;
}
public static void main(String[] args) {
//这里 你就写 16进制 字节就ok 比如我要算出下面 17个16进制字节的 CRC码
String[] strings = new String[]{ "02","0A","54","00","5D","0A","54","00","09","0A","5D","00","08","0A","5D","00","09"};
int[] ints = convert(strings);
//十进制 校验码.
System.out.println(crc16(ints,17));
//16进制 校验码
System.out.println(Integer.toHexString(crc16(ints,17)));
}
}