Java Modbus CRC16校验
最近在做一个跟前端硬件通信的中间件,其中数据校验采用CRC16,网上查了很多资料,但发现最终的计算结果都不同……耗时两天终于解决了,做个记录。
1 /**
2 * 计算CRC16校验码
3 *
4 * @param bytes 字节数组
5 * @return {@link String} 校验码
6 * @since 1.0
7 */
8 public static String getCRC(byte[] bytes) {
9 int CRC = 0x0000ffff;
10 int POLYNOMIAL = 0x0000a001;
11 int i, j;
12 for (i = 0; i < bytes.length; i++) {
13 CRC ^= ((int) bytes[i] & 0x000000ff);
14 for (j = 0; j < 8; j++) {
15 if ((CRC & 0x00000001) != 0) {
16 CRC >>= 1;
17 CRC ^= POLYNOMIAL;
18 } else {
19 CRC >>= 1;
20 }
21 }
22 }
23 return Integer.toHexString(CRC);
24 }
25
26 /**
27 * 将16进制单精度浮点型转换为10进制浮点型
28 *
29 * @return float
30 * @since 1.0
31 */
32 private float parseHex2Float(String hexStr) {
33 BigInteger bigInteger = new BigInteger(hexStr, 16);
34 return Float.intBitsToFloat(bigInteger.intValue());
35 }
36
37 /**
38 * 将十进制浮点型转换为十六进制浮点型
39 *
40 * @return String
41 * @since 1.0
42 */
43 private String parseFloat2Hex(float data) {
44 return Integer.toHexString(Float.floatToIntBits(data));
45 }