背景:有个蓝牙相关的小程序项目,需要向蓝牙设备写入数据,用到相关的知识,记录一下。
一、字符串转16进制字符串
// 字符串转16进制字符串
string2Hex(str) {
let val = ""
for (let i = 0; i < str.length; i++) {
if (val == "")
val = str.charCodeAt(i).toString(16)
else
val += str.charCodeAt(i).toString(16)
}
return val
}
二、16进制字符串转ArrayBuffer
// 16进制字符串转ArrayBuffer
hex2ArrayBuffer(hex_str) {
// let hex_str = 'AA5504B10000B5'
let typedArray = new Uint8Array(hex_str.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
}))
let buffer = typedArray.buffer
return buffer
}
三、ArrayBuffer转16进制字符串
// ArrayBuffer转16进制字符串
arrayBuffer2Hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('')
}
四、16进制字符串转字符串
// 16进制字符串转字符串
hex2String(hex_str) {
let trimedStr = hex_str.trim();
let rawStr = trimedStr.substr(0,2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
let len = rawStr.length;
if(len % 2 !== 0) {
console.log("Illegal Format ASCII Code!");
return "";
}
let curCharCode;
let resultStr = [];
for(let i = 0; i < len;i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join("");
}
五、字符串转ArrayBuffer
// 字符串转ArrayBuffer
string2ArrayBuffer(str) {
// 首先将字符串转为16进制
let val = ""
for (let i = 0; i < str.length; i++) {
if (val === '') {
val = str.charCodeAt(i).toString(16)
} else {
val += ',' + str.charCodeAt(i).toString(16)
}
}
// 将16进制转化为ArrayBuffer
return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
})).buffer
}
六、ArrayBuffer转字符串
// ArrayBuffer转字符串
arrayBuffer2String(buffer) {
return String.fromCharCode.apply(null, new Uint8Array(buffer))
}
记录于2022-01-05.