关于字节理解
字节(Byte):
是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串。
其中下发指令或处理数据时都可以应用到
1B
(byte,字节)= 8 bit(比特)
, 相当于一个字符
一个
字节能表示的最大
的整数就是255
- 例如: 数据为
5d000001be5d
理解为6个
字节(6B)
ARRAYBUFFER转16进度字符串
1 2 3 4 5 6 7 8 9 10
| function ab2hex(buffer) { var hexArr = Array.prototype.map.call( new Uint8Array(buffer), function(bit) { return ('00' + bit.toString(16)).slice(-2) } ) return hexArr.join(''); }
|
Demo
这里以使用微信小程序 蓝牙BLE
获取广播数据
为例。这里说明下: advertisData
是硬件另外返回的数据,有些供应商设备是没有返回的
1 2
| var hexStr = ab2hex(device.advertisData); console.log("广播数据中转换后:advertisData---->" + hexStr);
|
16进制转10进制 相加 取低字节
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
function hexToDec(hex) { let plusNum = 0; for (var i = 0; i < hex.length; i++) { let tempVal = parseInt(hex[i], 10); plusNum += tempVal; } console.log('相加的值是====>', plusNum); var hexStr = plusNum.toString(16); console.log("hexStr:" + hexStr); var s = "00" + hexStr; s = s.substr(s.length - 2, s.length); console.log('====截取低为数为:======>', s); return s; }
|
Demo 根据传入不同的编号转换16进制
, 再转10进制
,计算和取低字节
ps: 不知道理解最低字节
数是否正确, 有误请指点,谢谢
- 假设 计算和:
483
转16进制 ===》1e3
, 低字节为: e3
1 2 3 4 5 6 7 8 9 10 11 12 13
| let nums = Number(currentSerialVal); console.log('获取到编号:', nums); nums = nums.toString(16); nums = parseInt(nums, 16);
let hex = [0xf7, 0x62, 0x03, 0x45, 0x38, nums];
let toDec = utils.hexToDec(hex); toDec = parseInt(toDec, 16); hex.push(toDec); console.log('=====发送数据为:=====》', hex); writeData(hex);
|
10进制转16进制不足位数补零
发送字节大于255
, 当不足
位数时前面补0
。
注意: 一个
字节表示的最大
的整数是255
。
例:控制时间
指令为: [0xa1, 0x30, 0x00, 自定义时间n]
a. 发送时间30
秒,即[0x0a, 0x30, 0x00, 0x1e]
b. ? 假设: 900
秒,如何发送指令呢?
【难道是这样发送数据:[0x0a, 0x30, 0x00, 0x384]
正常是不可以的。】
大于255
字节如何处理?
- 假设:
900
转16进制后为 384
, 那么我们把他拆分为两个
字节发送就可以了。 即 【0x03
, 0x84
】
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| let n = 900; n = n.toString(16); var s = "00000000" + n; s = s.substr(n.length, s.length); let str1 = s.substring(4, 6); str1 = '0x' + str1; let str2 = s.substring(6, 8); str2 = str2.toString(16);;
var nS = parseInt(str1, 16) var nE = parseInt(str2, 16)
var hex = [0xa1, 0x30, nS, nE]; writeData(hex);
|
十六进制 转 十进制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
const hexToDecimalism = (hexToDecimalism) => { var trimedStr = hexToDecimalism.trim(); var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr; var len = rawStr.length; if (len % 2 !== 0) { console.log("存在非法字符!"); return ""; } var curCharCode; var resultStr = []; for (var i = 0; i < len; i = i + 2) { curCharCode = parseInt(rawStr.substr(i, 2), 16); resultStr.push(parseInt(curCharCode)); } return resultStr; }
|
Demo
1 2 3 4 5 6 7
| let tempStr = 'f75838'; let tempResult = utils.hexToDecimalism(tempStr.substring(0, 6)); console.log('tempResult--->', tempResult);
let tempStr = '0x58'; let tempResult = utils.hexToDecimalism(tempStr); console.log('tempResult--->', tempResult);
|
16进制转 ASCII
ASCII码对照表
单个值 转 ASCII
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
const hexCharCodeToStr = (hexCharCodeStr) => { var trimedStr = hexCharCodeStr.trim(); var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr; var len = rawStr.length; if (len % 2 !== 0) { console.log("存在非法字符!"); return ""; } var curCharCode; var resultStr = []; for (var i = 0; i < len; i = i + 2) { curCharCode = parseInt(rawStr.substr(i, 2), 16); resultStr.push(String.fromCharCode(curCharCode)); } console.log('转换后ASCII:', resultStr); return resultStr.join(""); }
|
Demo
1 2
| console.log(utils.hexCharCodeToStr('0x41')); console.log(utils.hexCharCodeToStr('41'));
|
数组 转 ASCII
1 2 3 4 5 6 7 8 9 10 11 12 13
|
const hexArrToCharCode = (hexArr) => { var resultStr = []; for (var i = 0; i < hexArr.length; i++) { let toHex = hexArr[i].toString(); resultStr.push(String.fromCharCode(toHex)); } let toStr = resultStr.join().replace(/,/g, ""); console.log('转ASCII值后----》', toStr); return toStr; }
|
Demo
这里以0123456789ABCDEF
字符进行转换
1 2 3
| var hex1 = [0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46]; let toCharCode = utils.hexArrToCharCode(hex1); console.log('转换后的值为', toCharCode);
|
ASCII码转16进制
1 2 3 4 5 6 7 8 9 10 11 12 13
| function strToHexCharCode(str) { if (str === "") { return ""; } else { var hexCharCode = []; hexCharCode.push("0x"); for (var i = 0; i < str.length; i++) { hexCharCode.push((str.charCodeAt(i)).toString(16)); } return hexCharCode.join(""); } }
|
前面自动补零
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
function prefixZero(num, n) { return (Array(n).join(0) + num).slice(-n); }
const formatNumber = n => { n = n.toString() return n[1] ? n : '0' + n }
|
demo
1 2 3 4 5 6 7
| let result = utils.prefixZero(5, 2); console.log('result-->', result);
console.log(utils.formatNumber(6))
|
数组值相加
1 2 3 4 5 6 7 8 9 10
|
function arrSum(arr) { var sum = 0; arr.forEach(function(val, i) { sum += val; }); return sum; }
|
三种数据之间转换案例
这是在开发蓝牙功能监听设备返回数据API
获取的数据
版权声明:本文为Smile_ping原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Smile_ping/article/details/103436942