【JavaScript】硬件通讯数据校验 BCC异或校验生成 按位取反 十六进制数据格式化

十六进制(简写为hex或下标16)是一种基数为16的计数系统,是一种逢16进1的[进位制]。通常用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)表示,其中:AF表示1015。

二进制(简写为bin)是一种基数为2的计数系统,是一种逢2进1的[进位制]。通常用数字0、1表示。

在与硬件对接的时候,会经常遇到进制转换和数据校验,电脑和硬件会采用两种不同的大小端模式,数据转换也需要对应的调整。

这里是两个处理十六进制格式化和BCC校验的函数,支持浏览器环境,小程序环境,node服务端。

我已经在小程序中使用这两个函数用来对接硬件设备的,通过蓝牙连接,订阅获取设备发送的数据。通常在硬件上返回的不是常用的json格式,是一个连续的十六进制数据,我们需要对返回的数据进行校验头尾和前面,确保接收的数据是完整的,然后将通过校验的数据,再次解析,获得我们最终需要处理的信息,可以是一个json,或者数字等等。

十六进制格式化

function formatHex(s) {
    
    
    if (s.indexOf(' ') < 0 && s.length % 2 === 1) {
    
    
        s = '0' + s;
    }
    s = s.replace(/(\w{2})(?=[^ ])/gim, "$1 ")
    s = s.replace(/^(\w) /gim, "0$1 ")
    s = s.replace(/ (\w)$/gim, " 0$1")
    s = s.replace(/ (\w) /gim, " 0$1 ")
    s = s.replace(/ (\w) /gim, " 0$1 ")
    return s;
}

BCC校验生成

function createBBC(text) {
    
    
    text = formatHex(text)
    text = text.split(' ')
    let sum = 0
    let count = 0
    for (let i = 0; i < text.length; i++) {
    
    
        if (text[i] !== "" && text[i] !== " ") {
    
    
            let val = parseInt(text[i], 16)
            sum = sum  + val;
            count++;
        }
    }
    console.log("结果",sum,count,text)
    let bbc = (255-sum).toString(16)
    console.log("取反",bbc)
    return bbc.toUpperCase()
}

猜你喜欢

转载自blog.csdn.net/sky529063865/article/details/125297917
今日推荐