最近项目涉及到android的串口通信,要发送的数据为十六进制,而且数据还要根据CRC16算法进行校验。
其中CRC16算法,网上找了很多,发现很多都有问题,最后,利用C语言版改编Java版,测试正常可用。
其中CRC16算法,网上找了很多,发现很多都有问题,最后,利用C语言版改编Java版,测试正常可用。
/**
* CRC检验
* @param Source
* @return
*/
public static String getCRC16(String source) {
int crc = 0xA1EC; // 初始值
int polynomial = 0x1021; // 校验公式 0001 0000 0010 0001
byte[] bytes = stringToHexByte(source); //把普通字符串转换成十六进制字符串
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7 - i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15 ^ bit)
crc ^= polynomial;
}
}
crc &= 0xffff;
StringBuffer result = new StringBuffer(Integer.toHexString(crc));
while (result.length() < 4) { //CRC检验一般为4位,不足4位补0
result.insert(0, "0");
}
return result.toString();
}
在CRC16校验的时候,需要把要发送的字符串转成十六进制字符数组,以便校验,以下为转换方法。
/**
* 把字符串转换成十六进制字节数