最近在做一个跟前端硬件通信的中间件,其中数据校验采用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 }
时间: 2024-10-16 13:51:08