十六进制(简写为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()
}