【微信小程序】处理蓝牙数据相关函数

1、将十六进制数组转换为 ArrayBuffer
function getBuffer(hexArr) {let buffer = new ArrayBuffer(hexArr.length)let dataView = new DataView(buffer);hexArr.forEach((item, index) => {dataView.setUint8(index, item);})return buffer
}
  • 创建了一个与输入数组长度相同的新的 ArrayBuffer 对象
  • 使用 DataView 对象来操作这个新的 ArrayBuffer
  • 遍历输入的十六进制数组,将每个元素转换为无符号 8 位整数(Uint8),并将其写入到新的 ArrayBuffer对象中
2、将ArrayBuffer 对象转换为十六进制字符串
function ab2hex(buffer) {let hexArr = Array.prototype.map.call(new Uint8Array(buffer),function (bit) {return ('00' + bit.toString(16)).slice(-2)})return hexArr.join('');
}
  • 创建一个空数组 hexArr
  • 通过调用 Array.prototype.map 方法,将输入的 ArrayBuffer 对象转换为一个由十六进制字符串组成的数组
  • map 方法的回调函数中,将每个字节转换为两位的十六进制字符串,并将其添加到 hexArr 中
  • 使用 join('') 方法将 hexArr 数组中的所有元素连接成一个完整的十六进制字符串,并返回结果
3、将十六进制字符串转换为 ASCII 字符串
function hexToAscii(hex) {var str = '';for (var i = 0; i < hex.length; i += 2) {var charCode = parseInt(hex.substr(i, 2), 16);str += String.fromCharCode(charCode);}return str;
}
  • 使用一个循环来遍历输入的十六进制字符串 hex。每次迭代,它会处理两个字符(一个字节)
  • 使用 parseInt 函数将当前两个字符的十六进制表示转换为一个十进制数值
  • 使用 String.fromCharCode 函数将该十进制数值转换为对应的 ASCII 字符,并将其添加到 str 字符串中
4、计算给定十六进制数组的 CRC 校验值
function getCrcData(hexArr) {let crcData = 0;for (let i = 0; i < hexArr.length; i++) {crcData ^= hexArr[i];}return '0x' + crcData.toString(16)
}
  • 在循环中,对 crcData 和当前遍历到的十六进制数组元素进行异或操作(^=)
  • 循环结束后,将计算得到的 CRC 校验值转换为十六进制字符串
5、将日期转换为十六进制字符串数组
function dateTohexString(date) {var date = new Date(date);var timestamp = Math.floor(date.getTime() / 1000); // 将日期转换为时间戳(以秒为单位)var buffer = new ArrayBuffer(4);var dataView = new DataView(buffer);dataView.setUint32(0, timestamp, true);var byteArray = new Uint8Array(buffer);var hexString = Array.from(byteArray).map(byte => byte.toString(16).padStart(2, '0')).join('');let arr = (hexString.match(/.{1,2}/g))let hexStringArr = []arr.forEach(item => {hexStringArr.push("0x" + item)})return hexStringArr
}
  • 创建一个长度为4的 ArrayBuffer 对象,并使用 DataView 来操作这个缓冲区
  • 使用 setUint32() 方法,它将时间戳写入到 ArrayBuffer
  • 使用 Uint8Array 类型的视图来获取 ArrayBuffer 的字节表示,并将其存储在变量 byteArray
  • 使用 Array.from() 方法将 byteArray 转换为普通数组,并通过 map() 方法将每个字节转换为两位的十六进制字符串
  • 使用 join('') 将所有的十六进制字符串连接成一个完整的字符串,并按每两个字符分割为数组元素
6、将十六进制字符串数组转换为日期对象
function hexStringToDate(hexString) {var byteArray = new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));var buffer = byteArray.buffer;var dataView = new DataView(buffer);var timestamp = dataView.getUint32(0, true) * 1000; // 将秒转换为毫秒var dateTime = new Date(timestamp);return dateTime
}
  • 接收一个十六进制字符串 hexString 作为输入
  • 使用正则表达式来将每两个字符分割为一个元素,并使用 map()方法将每个元素转换为对应的十进制数
  • 使用 Uint8Array 构造函数创建一个新的无符号8位整数数组,将转换得到的十进制数作为参数传递给它
  • 使用 byteArray.buffer 获取数组的缓冲区对象,并将其存储在变量 buffer
  • 使用 DataView对象来操作缓冲区
  • 使用 getUint32() 方法,它从缓冲区中读取四个字节,并将其作为以秒为单位的时间戳存储在变量 timestamp
  • 使用 new Date() 构造函数创建一个新的日期对象,并将时间戳作为参数传递给它,将结果存储在变量 dateTime
7、将时间字符串转换为反转的十六进制字符串数组
function timeTohexString(time) {var parts = time.split(":");var hours = parseInt(parts[0], 10); // 小时数var minutes = parseInt(parts[1], 10); // 分钟数// 计算总秒数var totalSeconds = hours * 3600 + minutes * 60;var hexString = totalSeconds.toString(16);while (hexString.length < 6) {hexString = '0' + hexString;}// 返回反转后的十六进制数组let pairs = hexString.match(/.{1,2}/g);let littleEndianHex = pairs.reverse();let newArr = littleEndianHex.map(item => '0x' + item)return newArr;
}
8、将给定的十进制数转换为一个反转的十六进制字符串数组
function decimalToHex(decimal, byteLength) {// 将十进制转换为十六进制字符串let hexString = decimal.toString(16);// 确保十六进制字符串占byteLength个字节while (hexString.length < byteLength) {hexString = '0' + hexString;}// 返回反转后的十六进制数组let pairs = hexString.match(/.{1,2}/g);let littleEndianHex = pairs.reverse();let newArr = littleEndianHex.map(item => '0x' + item)return newArr;
}
  • 确保十六进制字符串占据指定的字节长度
9、将十六进制字符串切分为字节数组
function splitHexStringToByteArray(hexString) {// 检查输入字符串的长度是否为偶数,如果不是,则在其前面添加一个0if (hexString.length % 2 !== 0) {hexString = '0' + hexString;}// 将输入字符串切分为一个字节的数组const byteArray = [];for (let i = 0; i < hexString.length; i += 2) {const byte = hexString.substr(i, 2);byteArray.push('0x' + byte);}return byteArray;
}
  • for 循环,每次从 hexString 中取出两个字符,将其转换为一个字节,并将结果存储在变量 byte 中
10、解析 TLV(Tag-Length-Value)数据
function parseTlvData(data) {const tlvArray = [];let index = 0;while (index < data.length) {const type = data[index];const length = data[index + 1];const value = data.slice(index + 2, index + 2 + length);tlvArray.push({type,length,value});index += 2 + length;}return tlvArray;
}
  • 初始化一个变量 index 为 0,表示从数据的起始位置开始解析
  • 在循环内部,首先获取当前索引位置的字节作为 TLV 的类型(Tag),并将其存储在变量 type 中
  • 获取下一个字节作为 TLV 的长度(Length),并将其存储在变量 length 中
  • 使用 slice() 方法从索引位置加 2 开始,截取长度为 length 的部分作为 TLV 的值(Value),并将其存储在变量 value 中
  • { type, length, value } 组成的对象添加到 tlvArray 数组中
  • 更新 index 的值,以便继续解析下一个 TLV 数据
11、将汉字转换为字符编码数组
function hanziTochart(hanzi) {let chart = [];for (let i = 0; i < hanzi.length; i++) {const charCode = hanzi.charCodeAt(i); // 获取每个字符的Unicode编码const hexString = (charCode.toString(16)).match(/.{1,2}/g); // 将Unicode编码转换为十六进制字符串hexString.map(item => {chart.push('0x' + item);})}return chart
}
12、将字符编码数组转换回汉字
function chartTohanzi(chart) {let chartArr = chart.match(/.{1,4}/g)let hanzi = "";for (let i = 0; i < chartArr.length; i++) {const hexString = chartArr[i];const charCode = parseInt(hexString, 16); // 将十六进制字符串转换为Unicode编码const char = String.fromCharCode(charCode); // 将Unicode编码转换为字符hanzi += char;}return hanzi
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能安全风险分析及应对策略

文│中国移动通信集团有限公司信息安全管理与运行中心 张峰 江为强 邱勤 郭中元 王光涛 人工智能&#xff08;AI&#xff09;是引领新一轮科技革命和产业变革的关键技术。人工智能赋能网络安全的同时&#xff0c;也会带来前所未有的安全风险。本文在介绍人工智能技术赋能网络安…

Docker高级篇之Docker搭建mysql主从复制架构

文章目录 1. 安装mysql主从复制2. 主从复制测试 1. 安装mysql主从复制 首先创建主节点 docker run -d -p 3308:3306 \ --privilegedtrue \ -v /Users/jackchai/Desktop/lottory_docker/learndocker/mymysql/master/log:/var/log/mysql \ -v /Users/jackchai/Desktop/lottory_…

端午假期来临,来使用闪侠惠递便宜寄快递吧!

相信很多人和我一样&#xff0c;每当需要寄快递时&#xff0c;总是感到十分头疼。不同的快递公司有不同的价格、时效和服务质量等等&#xff0c;选择起来真的很不容易。但是现在有了闪侠惠递来帮大家寄快递吧&#xff0c;这个问题就可以迎刃而解了&#xff01;小编奉劝大家快来…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十三)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 20 - 21节&#xff09; P20《19.ArkUI-属性动画和显式动画》 本节先来学习属性动画和显式动画&#xff1a; 在代码中定义动画&am…

【学习笔记】Linux前置准备

视频学习资料 基础&#xff1a; 黑马0基础&#xff08;前面四章即可&#xff0c;包含软件基础安装配置&#xff09; 进阶&#xff1a; 黑马程序员-Linux系统编程 黑马程序员-Linux网络编程 我也还没看&#xff0c;看了眼目录感觉把八股里面很多场景都讲到了&#xff0c;感觉有…

mysql自带分页

select 查询列表 from 表 limit offset,pagesize; offset代表的是起始的条目索引&#xff0c;默认从0开始size代表的是显示的条目数offset(n-1)*pagesize -- 第-页 limit 0 5 -- 第二页 limit 5,5 -- 第三页 limit 10,5 -- 第n页limit(n-1)*pagesize,pagesize -- pages…

在keil5中打开keil4工程的方法

文章目录 1. 打开文件 2. 安装旧版本包 3. 在keil4中打开keil5工程 1. 打开文件 在keil5 MDK的环境下&#xff0c;打开keil4的工程文件&#xff0c;会弹出下图所示的窗口&#xff1a; 参考官网的解释这两个方法分别为&#xff1a; 1. 使用MDK 版本 4 Legacy Pack时&#x…

Android 高德地图API(新版)

新版高德地图 前言正文一、创建应用① 获取PackageName② 获取调试版安全码SHA1③ 获取发布版安全码SHA1 二、配置项目① 导入SDK② 配置AndroidManifest.xml 三、获取当前定位信息① ViewBinding使用和导包② 隐私合规设置③ 权限请求④ 初始化定位⑤ 获取定位信息 四、显示地…

electron打包时资源下载失败cannot resolve xxx/30.0.9/electron-v30.0.9-win32-ia32.zip

同学们可以私信我加入学习群&#xff01; 正文开始 问题描述解决方案总结 问题描述 最近electron更新频繁&#xff0c;而我在用electron做个人项目&#xff0c;对稳定性没有太高要求&#xff0c;希望保持着electron的最新版本&#xff0c;所以就没有固定版本。 单位网络不太好…

抽象类和抽象方法(abstract)

1. 抽象类和抽象方法(abstract)的基本代码 用关键字abstract修饰的类称为abstract类(抽象类)。 例如: abstract class A {//......} 用关键字abstract修饰的方法称为abstract方法(抽象方法) 例如: abstract int min(int x,int y); 2. abstract类有如下特点 ●和普通的类相…

【MySQL】(基础篇一)—— SQL介绍和前置知识

我将会写一系列关于MySQL的博客&#xff0c;我会详细为你讲解数据库的知识以及MySQL的各种功能 数据的所有存储、检索、管理和处理实际上是由数据库软件——DBMS&#xff08;数据库管理系统&#xff09;完成的。MySQL是一种DBMS&#xff08;DataBase Manager Software&#xf…

Docker镜像加载原理(Union文件系统)

联合文件系统 Union文件系统&#xff0c;是一种轻量级的分层高性能服务系统&#xff0c;支持对文件系统的修改来进行一层一层的叠加&#xff0c;同时将不同目录挂载到同一个虚拟文件系统中&#xff0c;Union文件系统是Docker镜像的基础&#xff0c;通过分层来进行集成&am…

[第五空间 2021]WebFTP、[HCTF 2018]Warmup

目录 [第五空间 2021]WebFTP ​[SWPUCTF 2021 新生赛]Do_you_know_http [NCTF 2018]签到题 [HNCTF 2022 Week1]What is Web [HNCTF 2022 Week1]Interesting_http [HCTF 2018]Warmup [第五空间 2021]WebFTP 使用dirsearch扫描&#xff0c;发现有git泄露 使用GitHack克隆目…

Docker安装、使用,容器化部署springboot项目

目录 一、使用官方安装脚本自动安装 二、Docker离线安装 1. 下载安装包 2. 解压 3.创建docker.service文件 4. 启动docker 三、docker常用命令 1. docker常用命令 2. docker镜像命令 3. docker镜像下载 4.docker镜像push到仓库 5. docker操作容器 6.docker …

轻松实现文件随机提取:从众多文件夹中智能筛选指定数量文件,一键移至目标文件夹!

在信息爆炸的时代&#xff0c;电脑中的文件越来越多&#xff0c;整理起来却越来越头疼。你是否也曾在海量的文件夹中迷失&#xff0c;苦苦寻找那个特定的文件&#xff1f;你是否也曾为了将文件从一个文件夹移动到另一个文件夹而耗费大量时间&#xff1f;现在&#xff0c;我们为…

【实用技巧】Unity的InputField组件实用技巧

Unity的InputField组件非常灵活&#xff0c;提供了多种实用技巧来增强用户体验和开发效率。以下是一些有用的技巧&#xff1a; 1. 监听输入变化 使用OnValueChanged事件来监听用户输入的变化&#xff0c;这可以用于实时验证或更新UI。 inputField.onValueChanged.AddListene…

开发一个Dapp需要多少?

区块链开发一个Dapp要多少钱&#xff1f; 开发一个去中心化应用&#xff08;Dapp&#xff09;的成本取决于多个因素&#xff0c;包括Dapp的复杂性、功能需求、区块链平台以及开发团队的经验水平。以下是一些主要的影响因素&#xff1a; 1. 区块链平台&#xff1a;不同区块链…

《十八岁出门远行》世界很小,案牍劳形;世界很大,日短心长

《十八岁出门远行》世界很小&#xff0c;案牍劳形&#xff1b;世界很大&#xff0c;日短心长 余华&#xff0c;作家&#xff0c;著有《在细雨中呼喊》《活着》《文城》《兄弟》等。 文章目录 《十八岁出门远行》世界很小&#xff0c;案牍劳形&#xff1b;世界很大&#xff0c;日…

游戏心理学Day07

第二节学习 社会学习理论 按照条件反射的理论&#xff0c;个体行为的学习都是通过奖励或惩罚达到目的的 美国心理学家阿尔伯特班杜拉提出了社会学习理论&#xff0c;探讨个人的认知&#xff0c;行为与环境因素&#xff0c;三者及其交互作用&#xff0c;对人类行为的影响 记…

2048小游戏的菜鸡实现方法

# 2048小游戏的实现与分析 2048是一款非常受欢迎的数字滑块游戏&#xff0c;其目标是通过滑动和合并相同数字的方块来创建一个值为2048的方块。下面&#xff0c;我们将通过分析一个C语言实现的2048小游戏的源代码&#xff0c;来探索如何用编程实现这款游戏。 ## 游戏概述 20…