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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM