微信小程序蓝牙BLE开发——进制转换

这段时间开发共享设备,对接蓝牙BLE设备通信协议,过程中用到一些进制转换, 记录下方便使用。

有些参考大神们,感谢分享。

文章目录

  • 微信小程序蓝牙BLE开发——进制转换
    • 关于字节理解
    • ArrayBuffer转16进制字符串
    • 16进制转10进制 相加 取低字节
    • 10进制转16进制不足位数补零
      • `大于255`字节如何处理?
    • 十六进制 转 十进制
    • 16进制转 ASCII
      • 单个值 转 ASCII
      • 数组 转 ASCII
    • ASCII码转16进制
    • 前面自动补零
    • 数组值相加
    • 三种数据之间转换`案例`

关于字节理解

字节(Byte):是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串。

其中下发指令或处理数据时都可以应用到

  • 1B(byte,字节)= 8 bit(比特), 相当于一个字符
  • 一个字节能表示的最大的整数就是255
  • 例如: 数据为5d000001be5d理解为6个字节(6B)

ArrayBuffer转16进制字符串

// ArrayBuffer转16进度字符串示例
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是硬件另外返回的数据,有些供应商设备是没有返回的

var hexStr = ab2hex(device.advertisData);
console.log("广播数据中转换后:advertisData---->" + hexStr);  //0000365544332211

16进制转10进制 相加 取低字节

/*** 16进制转10进制 相加* 取低字节*/
function hexToDec(hex) {let plusNum = 0;for (var i = 0; i < hex.length; i++) {let tempVal = parseInt(hex[i], 10); //注: 如字符串数组需写16// console.log('tempVal---->', tempVal)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); // 截取最后2位字符console.log('====截取低为数为:======>', s);return s;
}

Demo 根据传入不同的编号转换16进制, 再转10进制,计算和取低字节

ps: 不知道理解最低字节数是否正确, 有误请指点,谢谢

  • 假设 计算和: 483 转16进制 ===》1e3, 低字节为: e3
let nums = Number(currentSerialVal);
console.log('获取到编号:', nums); //nums = 10
nums = nums.toString(16); //转16进制 ==》a
nums = parseInt(nums, 16); //字符串转整数// 16进制转10进制
let hex = [0xf7, 0x62, 0x03, 0x45, 0x38, nums];
// console.log(hex.map(String));
let toDec = utils.hexToDec(hex); //[247, 98, 3, 69, 56, 10]
toDec = parseInt(toDec, 16); //取最低字节转16进制   //得f6
hex.push(toDec); //[247, 98, 3, 88, 56, 10, 246]
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
let n = 900;
n = n.toString(16);  // 将900转化为16进制数(以字符串显示)
var s = "00000000" + n;
s = s.substr(n.length, s.length); // 截取最后8位字符
let str1 = s.substring(4, 6);
str1 = '0x' + str1; //同等: str1 = str1.toString(16); 无需拼0x
let str2 = s.substring(6, 8);
str2 = str2.toString(16);;var nS = parseInt(str1, 16) //字符串转16进制
var nE = parseInt(str2, 16)var hex = [0xa1, 0x30, nS, nE];
writeData(hex);  //写入数据

十六进制 转 十进制

/*** 十六进制 转 十进制*/
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));}// console.log('转换后十进制:', resultStr);return resultStr;
}

Demo

let tempStr = 'f75838';
let tempResult = utils.hexToDecimalism(tempStr.substring(0, 6));
console.log('tempResult--->', tempResult);   //[247, 88, 56]let tempStr = '0x58';
let tempResult = utils.hexToDecimalism(tempStr);
console.log('tempResult--->', tempResult);   //[88]

16进制转 ASCII

ASCII码对照表

单个值 转 ASCII

/*** 16进制转 ASCII*/
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

console.log(utils.hexCharCodeToStr('0x41')); // A
console.log(utils.hexCharCodeToStr('41')); // A

数组 转 ASCII

/*** 16进制数组转ASCII*/
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字符进行转换

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); //0123456789ABCDEF

ASCII码转16进制

//ASCII码转16进制
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("");}
}

前面自动补零

/*** 前面自动补零*  num传入的数字,n需要的字符长度*/
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

//方法一:
let result = utils.prefixZero(5, 2);
console.log('result-->', result);  //05//方法二:
console.log(utils.formatNumber(6)) //06

数组值相加

/*** 数组 值相加*/
function arrSum(arr) {var sum = 0;arr.forEach(function(val, i) {sum += val;});return sum;
}

三种数据之间转换案例

这是在开发蓝牙功能监听设备返回数据API获取的数据

微信小程序蓝牙BLE开发——关于进制转换(四)相关推荐

  1. 微信小程序蓝牙BLE开发实战——案例(二)

    微信小程序蓝牙BLE开发实战(二) 上篇主要介绍在开发过程中应用到相关API操作.接下来介绍个人在项目开发中应用蓝牙BLE一些事情. 由于时间比较仓促, 有些注释没那么详细.请理解~写的不好欢迎各位大 ...

  2. 微信小程序蓝牙BLE开发——写入一串16进制数据,低字节在前(五)

    微信小程序BLE发送一串16进制数据,低字节在前 文章目录 微信小程序BLE发送一串16进制数据,低字节在前 场景 获取UTC时间 写入数据 向设备发送16进制数据 字节转换 验证发送UTC时间 场景 ...

  3. 微信小程序 - 蓝牙BLE小程序开发

    1.前言 最近领导看我比较闲,安排我开发一个蓝牙BLE微信小程序,刚开始接到这个项目时,我第一反应时,"卧槽"".老子在公司的岗位是做Windows和Android 软件 ...

  4. 微信小程序蓝牙功能开发与问题记录

    一.蓝牙支持情况 1. 微信小程序对蓝牙的支持情况 目前普遍使用的蓝牙规格:经典蓝牙和蓝牙低功耗. 经典蓝牙(蓝牙基础率/增强数据率):常用在对数据传输带宽有一定要求的大数据量传输场景上,比如需要传输 ...

  5. 乐鑫Esp32学习之旅 19 重磅开源,如何在微信小程序上ble蓝牙配网esp32,blufi的那些事!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  6. 【微信小程序控制硬件14 】 微信小程序蓝牙+WiFi双控制ESP32-C3应用示范;(附带Demo)

    文章目录 一.前言 二.设备核心代码 2.1 蓝牙控制 2.2 WiFi控制 2.3 外设驱动 三.微信小程序核心代码 3.1 蓝牙搜索 3.2 蓝牙服务发现 四.感谢 另外,不要把我的博客作为学习标 ...

  7. wx.getBLEDeviceCharacteristics 微信小程序蓝牙 微信小程序热敏打印机

    1 微信小程序蓝牙功能开发概述 第一步 判断当前微信版本,是否支持蓝牙 通信 第二步 打开蓝牙 第三步扫描设备 第四步连接设备 第五步 获取服务与特征值 看是否支持读写数据操作 第六步 发送数据 本文 ...

  8. 微信小程序蓝牙模块BLE开发说明基础知识

    微信小程序蓝牙模块说明 一.简介 微信小程序作为轻量级应用的载体,确实方便了很多的应用场景.传统的产品如果要和手机互联互通,那么必须要开发两套APP,即IOS和安卓.十分的麻烦和成本巨高.但是微信小程 ...

  9. 泰凌微ble mesh蓝牙模组天猫精灵学习之旅 ② 如何实现 微信小程序蓝牙控制 Ble Mesh模组 安信可TB02,全部开源!

    本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小 ...

最新文章

  1. 第十八课.动态图模型
  2. 旋转矩阵与欧拉角之间的转换
  3. step5 . day2 网络编程 基于TPC协议的网络编程流程及API
  4. Angular Component TypeScript代码和最后转换生成的JavaScript代码比较
  5. ​Nat. Commun.速递:深度学习在计算生物学中的应用综述
  6. 红包指定分配金额php,php仿微信红包分配算法的实现方法_PHP
  7. php 查找数组相同元素,查找数组中重复的元素
  8. asp.net中有关URL的信息
  9. 分布式面试 - dubbo 的 spi 思想是什么?
  10. STC15W408读取HX711称重数据串口发送
  11. oracle rman备份 归档模式,Oracle RMAN备份归档与非归档模式
  12. JQuery表单验证插件EasyValidator
  13. 锐捷文件描述错误linux,ubuntu下使用锐捷客户端连接校园网-郑州大学Ruijieclient for Linux下载及配置指导...
  14. rpc服务器不可用自动重启,出现RPC服务器不可用的解决方法
  15. 以“人民的名义”劝你快去读点书
  16. 大数定律和中心极限定理(未完成)
  17. 理解CMMI 3级过程域非常好的例子
  18. 【XSY2753】LCM
  19. 207399-07-3,IR-780;IR-808;1558079-49-4,IR-825
  20. 计算机网络 lab2 Ethernet

热门文章

  1. 16篇论文入选AAAI 2021,京东数科AI都在关注什么?(附论文下载)
  2. 2021 AAAI best Paper - Informer-2020 学习记录
  3. 同時acts_as_tree 和 ancestry gem
  4. object.assign()是深拷贝?还是浅拷贝?
  5. 王者荣耀服务器维护8月23日,王者荣耀8月23日更新公告:其它系统优化及BUG修复...
  6. Android开发文件上传
  7. locate用主动还是被动_主动形式表被动意义
  8. ORACLE集群管理-核心资源分析-MDNS
  9. 花点时间自己DIY一款心仪的App
  10. 第一坊颜韵和第一坊阿哲抢头条视频直播,一人和宝哥礼物之战