最近项目涉及到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校验的时候,需要把要发送的字符串转成十六进制字符数组,以便校验,以下为转换方法。
/**
* 把字符串转换成十六进制字节数

本文介绍了一个在Android串口通信中使用的CRC16校验算法,通过Java代码详细解释了如何从C语言版本改编为Java版本。内容包括CRC16校验的初始化、校验公式应用及字符串到十六进制字节数组的转换方法。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



