//crc 之前数据,数据长度
unsigned short CRC16(unsigned char const *buf, unsigned int len)
{
unsigned short Crc=0xffff;
int i;
for(i=0; i {
Crc = ((Crc >> 8) & 0xFF) ^ CRC16Table [(Crc^ *buf++) & 0xFF];
}
return Crc;
}
http://blog.sina.com.cn/s/blog_3e28c8a50102vcp4.html
自已把0x0000改成0xffff就行了
https://www.jianshu.com/p/3c1398d086a7
里面有crc算法的各种语言实现
int CRC16(byte[] buf)
{
int Crc=0xffff;
int i;
for(i=0; i < buf.length; i++){
Crc = ((Crc >> 8) & 0xFF) ^ CRC16Table [(Crc^ buf[i]) & 0xFF];
}
return Crc&0xFFFF;
}
问题解决了, 解决方案如下。
/**
* 计算CRC16校验码
*
* @param bytes 字节数组
* @return {@link String} 校验码
* @since 1.0
*/
public static String getCRC(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) != 0) {
CRC >>= 1;
CRC ^= POLYNOMIAL;
} else {
CRC >>= 1;
}
}
}
return Integer.toHexString(CRC);
}
/**
* 将16进制单精度浮点型转换为10进制浮点型
*
* @return float
* @since 1.0
*/
private float parseHex2Float(String hexStr) {
BigInteger bigInteger = new BigInteger(hexStr, 16);
return Float.intBitsToFloat(bigInteger.intValue());
}
/**
* 将十进制浮点型转换为十六进制浮点型
*
* @return String
* @since 1.0
*/
private String parseFloat2Hex(float data) {
return Integer.toHexString(Float.floatToIntBits(data));
}