Java CRC16算法校验
16lz
2021-01-26
最近项目涉及到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 0001byte[] 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位补0result.insert(0, "0");}return result.toString();}
在CRC16校验的时候,需要把要发送的字符串转成十六进制字符数组,以便校验,以下为转换方法。 /** * 把字符串转换成十六进制字节数组 * * @param hexString * @return byte[] */public static byte[] stringToHexByte(String hex) {int len = (hex.length() / 2);byte[] result = new byte[len];char[] achar = hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));}return result;}
更多相关文章
- Android客户端与服务器端通过DES加密认证
- android中易错点
- string.xml中占位符的使用
- Android(安卓)strings.xml文件定义字符串中的标签
- 关于 SimpleAdapter 适配器
- Android(安卓)使用Gson解析json用法
- Android(安卓)获得Url、Uri字符串后面拼接的参数
- Andrid中的plurals
- http通信,Android(安卓)Gzip压缩解压