Javascript BCC校验(异或校验)

更新日期: 2021-05-13 阅读次数: 5270 字数: 205 分类: 微信小程序

由于要使用微信小程序给蓝牙设备发送指令,但是担心指令传输中数据错乱,所以添加了异或校验,即BCC校验。

异或校验原理

参考

http://www.ip33.com/bcc.html

BCC(Block Check Character/信息组校验码),因校验码是将所有数据异或得出,故俗称异或校验。具体算法是:将每一个字节的数据(一般是两个16进制的字符)进行异或后即得到校验码。 例如16进制数据:01 A0 7C FF 02

计算:01 xor A0 xor 7C xor FF xor 02 = 20

校验码是:20

即,最终结果就是一个字节(两个十六进制字符)

异或的计算规则

异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法

JS 的异或操作

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_XOR_assignment

Operator: x ^= y
Meaning:  x  = x ^ y

JS 实现

参考

https://www.coder.work/article/3845408

function chk8xor(byteArray) {
  let checksum = 0x00
  for(let i = 0; i < byteArray.length - 1; i++)
    checksum ^= byteArray[i]
  return checksum
}

参考上面的实现,我写了一个基于 dataView 版本的

  /**
   * 异或校验, 即 BCC 校验
   * 剔除头尾字节,及倒数第二个字节的校验位
   **/
  bcc: function(dataView) {
    let checksum = 0x00
    for (let i = 1; i < dataView.byteLength - 2; i++) {
      checksum ^= dataView.getInt8(i)
    }

    return checksum
  }

Web 在线计算

TODO

tags: 微信小程序异或校验

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式