公司有个apk要与硬件对接拿到实时温度和重量,使用安卓基座进行处理,他那边相应2为16进制有效值,于是需要将值进行处理拿到正确的值
1.安卓基座传过来的byte数据,首先将byte组转换为16进制
// byte转16进制
function BytesToHexString(arrBytes) {
var str = "";
for (var i = 0; i < arrBytes.length; i++) {
var tmp;
var num = arrBytes[i];
if (num < 0) {
//此处填坑,当byte因为符合位导致数值为负时候,需要对数据进行处理
tmp = (255 + num + 1).toString(16);
} else {
tmp = num.toString(16);
}
if (tmp.length == 1) {
tmp = "0" + tmp;
}
str += tmp;
}
return str;
}
2.截取数组中我们需要的值,我这对接的是需要2位
let num1 = res.result.substr(6, 2);
let num2 = res.result.substr(8, 2);
3.再将16进制转为二进制
let num12S = parseInt(num1, 16).toString(2)
let num22S = parseInt(num2, 16).toString(2)
4.转为2进制后可能长度不够需要进行补零操作,定义补0方法将num12S,num12S进行补零
// 长度不够前置补0
function fillZero(num, length) {
return num.padStart(length,0);
}
5.如果转换的二进制第一位是1那么其值就为负数,此时就需要对负数的二进制进行处理,将其变成正数,
function twoComplete(num) {
const reg = /1|0/g;
var binary = num.toString(2);
var twoC = binary.replace(reg, (x) => { return x === "0" ? "1" : "0" }); //取反
console.log(twoC);
return `-${(parseInt(twoC, 2) + 1).toString(10)}`
}
6.如果不为负数使用16进制转10进制方法
// 16进制转10进制
function hex2int(hex) {
var len = hex.length, a = new Array(len), code;
for (var i = 0; i < len; i++) {
code = hex.charCodeAt(i);
if (48 <= code && code < 58) {
code -= 48;
} else {
code = (code & 0xdf) - 65 + 10;
}
a[i] = code;
}
return a.reduce(function (acc, c) {
acc = 16 * acc + c;
return acc;
}, 0);
}
7.使用如果首值为负数,那么就使用twoComplete方法
if (num12S[0] == 1) {
uni.$cu.log('负号');
// resolve(twoComplete(`${num12S}${num22S}${num32S}${num42S}`));
resolve(twoComplete(`${num12S}${num22S}`));
} else {
resolve(parseFloat(hex2int(`${num1}${num2}`)))
}
完整处理代码如下
function read2SP() {
return new Promise((resolve, reject) => {
SerialPortPlugin.read(handle, 16, 200, (res) => {//句柄,缓存大小,超时时间,回调
// uni.showToast({title: JSON.stringify(res), duration: 1500, icon: 'none'})
if (res.code === 200) {
res.result = BytesToHexString(res.result)
let num1 = res.result.substr(6, 2);
let num2 = res.result.substr(8, 2);
let num12S = parseInt(num1, 16).toString(2)
let num22S = parseInt(num2, 16).toString(2)
// 前置补0
num12S = fillZero(num12S, 8);
num22S = fillZero(num22S, 8);
// 负号 -> 取反码 再补码
if (num12S[0] == 1) {
uni.$cu.log('负号');
// resolve(twoComplete(`${num12S}${num22S}${num32S}${num42S}`));
resolve(twoComplete(`${num12S}${num22S}`));
} else {
resolve(parseFloat(hex2int(`${num1}${num2}`)))
}
} else {
reject();
console.log(`失败: ${res.message}`);
}
})
})
}