1、CRC16(Modbus,多项式为0x8005)的Java实现:
public int getCrc16_Modbus(byte[] data) { int crc = 0xFFFF; int POLYNOMIAL = 0xA001; for (byte b : data) { crc ^= b & 0xFF; for (int i = 0; i < 8; i++) { if ((crc & 1) == 1) { crc = (crc >>> 1) ^ POLYNOMIAL; } else { crc = crc >>> 1; } } } return crc; }
2、CRC16(CCITT-FALSE,多项式0x1021)的Java实现:
public int getCrc16CCITT_False(byte[] bytes) { int crc = 0xffff; // initial value int polynomial = 0x1021; // poly value for (int index = 0; index < bytes.length; index++) { byte b = bytes[index]; for (int i = 0; i < 8; i++) { boolean bit = ((b >> (7 - i) & 1) == 1); boolean c15 = ((crc >> 15 & 1) == 1); crc <<= 1; if (c15 ^ bit) crc ^= polynomial; } } crc &= 0xffff; return crc; }