1、计算方法
1) CRC16 校验寄存器赋值为 0xFFFF;
2) 取被校验串的第一个字节赋值给临时寄存器;
3) 临时寄存器与 CRC16 校验寄存器的高位字节进行“异或”运算,赋值给 CRC16 校验寄存器;
4) 取 CRC16 校验寄存器最后一位赋值给检测寄存器;
5) 把 CRC16 校验寄存器右移一位;
6) 若检测寄存器值为 1,CRC16 校验寄存器与多项式 0xA001 进行“异或”运算,赋值给 CRC16 校验寄存器;
7) 重复步骤 4~6,直至移出 8 位;
8) 取被校验串的下一个字节赋值给临时寄存器;
9) 重复步骤 3~8,直至被校验串的所有字节均被校验;
10) 返回 CRC16 校验寄存器的值。
代码:
/**
* 字符串转byte数组
* @param str
* @returns {Array}
*/
function stringTobyte(str) {
var charArr, stArr, resultArr = [];
for (var i = 0; i < str.length; i++ ) {
charArr = str.charCodeAt(i);
stArr = [];
do {
stArr.push( charArr & 0xFF );
charArr = charArr >> 8;
}
while ( charArr );
resultArr = resultArr.concat( stArr.reverse() );
}
return resultArr;
}
/**
* 国标212协议CRC校验
* @param data string类型字符串
* @returns {string} 十六进制字符串
* @constructor
*/
function GB212_CRC(data){
data = stringTobyte(data)
var crcValue = 0xFFFF
for(var i=0;i<data.length;i++){
crcValue = (crcValue >> 8)^data[i]
for(var j=0;j<8;j++){
var sbit=crcValue&0x0001
crcValue=crcValue>>1
if(sbit == 1){
crcValue^=0xA001
}
}
}
return crcValue.toString(16)
}
function testGB212(){
var str="QN=20201105000000189;ST=32;CN=2061;PW=123456;MN=399435X0000206;Flag=1;CP=&&DataTime=20201104230000;9735-Min=4.89,9735-Avg=4.89,9735-Max=4.89,9735-Flag=N;9733-Min=14.59,9733-Avg=14.59,9733-Max=14.59,9733-Flag=N;9734-Min=1.92,9734-Avg=1.92,9734-Max=1.92,9734-Flag=N&&"
console.log(GB212_CRC(str)) //结果:7640
}