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     }

 

posted @ 2016-02-25 19:37  koneloong  阅读(10182)  评论(1编辑  收藏  举报