js实现国标212CRC校验

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
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值