最近在做一個跟前端硬件通信的中間件,其中數據校驗采用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 }