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