Javascript BCC校验(异或校验)

文章目录

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

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式