private static String crc16(byte[] bytes)
{
int CRC = 0x0000ffff;
int POLYNOMIAL = 0x0000a001;
int i, j;
for (i = 0; i < bytes.length; i++) {
CRC ^= (int) bytes[i]&0x000000ff;
for (j = 0; j < 8; j++) {
if ((CRC & 0x00000001) == 1) {
CRC >>= 1;
CRC ^= POLYNOMIAL;
} else {
CRC >>= 1;
}
}
}
//高低位转换,看情况使用
CRC = ( (CRC & 0x0000FF00) >> 8) | ( (CRC & 0x000000FF ) << 8);
return Integer.toHexString(CRC);
}
源码摘自线上,在CRC ^= (int) bytes[i]&0x000000ff;加入强制转换,修复了遇到高位为1的字节后计算错误的情况。
JAVA存储以补码的形式存储,在做位运算时需注意。