将hex转换为 CRC-16/XMODEM 校验

本CRC校验位的计算方式:

初始值(iChecksum):0000

结果异或值:0000

CRC位宽度:16位

多项式(POLY):0x1021

注:crc位计算的数据来源不包括包头和包尾。

如下图:

function Str2Bytes(str){
		var pos = 0;
		var len = str.length;
		if (len % 2 != 0) {
		  return null;
		}
		len /= 2;
		var hexA = new Array();
		for (var i = 0; i < len; i++) {
		  var s = str.substr(pos, 2);
		  var v = parseInt(s, 16);
		  hexA.push(v);
		  pos += 2;
		}
		return hexA;
	  }

function CRC_16_XMODEM(bytes, length) {
    let crc = 0x0000;
    let polynomial = 0x1021;
    for (let index = 0; index < length; index++) {
      let b = bytes[index];
      for (let i = 0; i < 8; i++) {
        let bit = ((b >> (7 - i) & 1) == 1);
        let c15 = ((crc >> 15 & 1) == 1);
        crc <<= 1;
        if (c15 ^ bit)
          crc ^= polynomial;
    }
}
    crc &= 0xffff;
    // 输出String字样的16进制
    let strCrc = crc.toString(16).toLocaleUpperCase();
    switch (strCrc.length) {
      case 1:
        strCrc = "000" + strCrc;
        break;
      case 2:
        strCrc = "00" + strCrc;
        break;
      case 3:
        strCrc = "0" + strCrc;
        break;
      case 4:
        strCrc = strCrc
        break;
      default:
        break;
    }
    strCrc = strCrc[0] + strCrc[1] + strCrc[2] + strCrc[3]
    return strCrc;

  }
  
	let datass = '557300'
	console.log( CRC_16_XMODEM(Str2Bytes(datass), datass.length / 2) )

运行结果如下:

代码奉献给大家,我这也是苦熬了一天!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东成2022

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值