JS CRC16/XMODEM

复制代码
const byteData= HexString2Bytes("1A3B4C5D")
let crc = crc16(byteData)
// CRC转换: A185
console.log("CRC转换:",crc)

function crc16(buffer) {
  var crc = 0x0000;
  var odd;

  for(var i = 0; i < buffer.length; i++) {
    crc ^= (buffer[i] << 8)
    for(var j = 0; j < 8; j++) {
      odd = crc & 0x8000;
      crc = crc << 1;
      if(odd) {
        crc = crc ^ 0x1021
      }
    }
  }

  var hi = ((crc & 0xFF00) >> 8); //高位置
  var lo = (crc & 0x00FF); //低位置
  var crcArr = []
  crcArr.push(hi)
  crcArr.push(lo)
  crc &= 0xFFFF
  return crcToString(crcArr, true)
};    

//转为大写String
function crcToString(arr, isReverse) {

  if(typeof isReverse == 'undefined') {
    isReverse = true;
  }

  var hi = arr[0],
  lo = arr[1];
  return padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0');

};

function padLeft(s, w, pc) {

    if (pc == undefined) {
        pc = '0';
    }

    for (var i = 0, c = w - s.length; i < c; i++) {
        s = pc + s;
    }

    return s;

};

//十六进制字符串转字节数组
function HexString2Bytes(str) {

    var pos = 0;
    var len = str.length;

    if (len % 2 != 0) {
      return null;
    }

    len /= 2;
    var arrBytes = new Array();

    for (var i = 0; i < len; i++) {
      var s = str.substr(pos, 2);
      var v = parseInt(s, 16);
      arrBytes.push(v);
      pos += 2;

    }

    return arrBytes;
  }
相关推荐
缓慢更新31 分钟前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
超级架构师42 分钟前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
陈随易1 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
叼烟扛炮1 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
风骏时光牛马2 小时前
AI稳定性治理体系构建与疑难问题深度分析
前端
LMT流氓兔2 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放2 小时前
Python基础语法练习题(75)
开发语言·python·学习
IT_陈寒2 小时前
JavaScript的this坑人实录,这次我真的记下来了
前端·人工智能·后端
starzy19903 小时前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala