【蓝牙小程序】关于接收VOFA JustFloat格式协议的思路

news/2025/3/14 14:54:18/文章来源:https://www.cnblogs.com/FBsharl/p/18772073

问题1:如何让32字节的数据转换为浮点数

在微信小程序中,将32字节的数据转换为浮点数,通常需要先将字节数据转换为32位整数,再将其解释为浮点数。以下是具体步骤:

1. 使用 DataView 对象

DataView 可以处理不同字节序的数据,适合处理二进制数据。

javascript
复制
// 假设你有一个32字节的ArrayBuffer
let arrayBuffer = new ArrayBuffer(32);
let dataView = new DataView(arrayBuffer);// 读取前4字节作为32位浮点数
let floatValue = dataView.getFloat32(0, true); // true 表示小端序,false 表示大端序console.log(floatValue);

2. 使用 Float32Array

如果数据已经是 ArrayBuffer,可以直接使用 Float32Array 来读取浮点数。

javascript
复制
// 假设你有一个32字节的ArrayBuffer
let arrayBuffer = new ArrayBuffer(32);
let floatArray = new Float32Array(arrayBuffer);// 读取第一个浮点数
let floatValue = floatArray[0];console.log(floatValue);

3. 处理字节序

如果数据来自网络或其他设备,需注意字节序(大端序或小端序)。DataView 可以指定字节序:

javascript
复制
let floatValue = dataView.getFloat32(0, true); // true 表示小端序,false 表示大端序

4. 示例代码

假设你有一个32字节的 ArrayBuffer,并想将其中的前4字节转换为浮点数:

javascript
复制
// 创建一个32字节的ArrayBuffer
let arrayBuffer = new ArrayBuffer(32);
let dataView = new DataView(arrayBuffer);// 假设前4字节表示一个浮点数
dataView.setFloat32(0, 123.456, true); // true 表示小端序// 读取浮点数
let floatValue = dataView.getFloat32(0, true);console.log(floatValue); // 输出: 123.456

总结

  • 使用 DataView 或 Float32Array 将字节数据转换为浮点数。

  • 注意字节序,确保与数据源一致。

  • 通过 ArrayBuffer 处理二进制数据。

这些方法适用于微信小程序中的二进制数据处理。

问题2:如何判断一帧的帧尾是特定的字节,比如 0x00 0x00 0x80 0x7f

在微信小程序中,判断一帧数据的帧尾是否为特定字节(如 0x00 0x00 0x80 0x7f),可以通过读取帧数据的末尾字节并进行比较来实现。以下是具体实现方法:


1. 使用 ArrayBuffer 和 DataView

ArrayBuffer 和 DataView 是处理二进制数据的常用工具。可以通过它们读取帧数据的末尾字节并进行比较。

示例代码

javascript
复制
// 假设 frameBuffer 是一个 ArrayBuffer,表示一帧数据
function isFrameEndValid(frameBuffer) {// 创建一个 DataView 来读取数据const dataView = new DataView(frameBuffer);const frameLength = dataView.byteLength;// 检查帧长度是否足够if (frameLength < 4) {console.log("帧数据长度不足");return false;}// 读取帧尾的4个字节const byte1 = dataView.getUint8(frameLength - 4); // 倒数第4个字节const byte2 = dataView.getUint8(frameLength - 3); // 倒数第3个字节const byte3 = dataView.getUint8(frameLength - 2); // 倒数第2个字节const byte4 = dataView.getUint8(frameLength - 1); // 倒数第1个字节// 判断是否匹配特定字节if (byte1 === 0x00 && byte2 === 0x00 && byte3 === 0x80 && byte4 === 0x7f) {console.log("帧尾匹配");return true;} else {console.log("帧尾不匹配");return false;}
}// 示例:测试帧数据
const frameBuffer = new ArrayBuffer(10);
const dataView = new DataView(frameBuffer);// 设置帧尾为 0x00 0x00 0x80 0x7f
dataView.setUint8(6, 0x00); // 倒数第4个字节
dataView.setUint8(7, 0x00); // 倒数第3个字节
dataView.setUint8(8, 0x80); // 倒数第2个字节
dataView.setUint8(9, 0x7f); // 倒数第1个字节// 判断帧尾是否匹配
console.log(isFrameEndValid(frameBuffer)); // 输出: true

2. 使用 Uint8Array

如果帧数据是以 Uint8Array 的形式存储的,可以直接访问数组的末尾元素进行比较。

示例代码

javascript
复制
// 假设 frameData 是一个 Uint8Array,表示一帧数据
function isFrameEndValid(frameData) {const frameLength = frameData.length;// 检查帧长度是否足够if (frameLength < 4) {console.log("帧数据长度不足");return false;}// 读取帧尾的4个字节const byte1 = frameData[frameLength - 4]; // 倒数第4个字节const byte2 = frameData[frameLength - 3]; // 倒数第3个字节const byte3 = frameData[frameLength - 2]; // 倒数第2个字节const byte4 = frameData[frameLength - 1]; // 倒数第1个字节// 判断是否匹配特定字节if (byte1 === 0x00 && byte2 === 0x00 && byte3 === 0x80 && byte4 === 0x7f) {console.log("帧尾匹配");return true;} else {console.log("帧尾不匹配");return false;}
}// 示例:测试帧数据
const frameData = new Uint8Array([0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, 0x80, 0x7f]);// 判断帧尾是否匹配
console.log(isFrameEndValid(frameData)); // 输出: true

3. 注意事项

  1. 帧长度检查:在读取帧尾之前,务必检查帧数据的长度是否足够,避免越界访问。

  2. 字节序:如果帧数据涉及多字节数值(如 Uint16 或 Float32),需要注意字节序(大端序或小端序)。

  3. 性能优化:如果帧数据较大,可以只读取末尾的4个字节,而不是遍历整个帧数据。


总结

  • 使用 DataView 或 Uint8Array 读取帧数据的末尾字节。

  • 比较末尾字节是否与特定字节匹配。

  • 确保帧数据长度足够,避免越界访问。

这种方法适用于微信小程序中处理二进制数据的场景。

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

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

相关文章

华为开发者空间:基于DeepSeek+Cherry Studio构建模拟面试助手

通过实际操作,让开发者熟悉如何通过云主机部署DeepSeek,以及如何将DeepSeek与Cherry Studio结合起来帮助我们解决一些实际的问题。本文分享自华为云社区《华为开发者空间:基于DeepSeek+Cherry Studio构建模拟面试助手》,作者:开发者空间小蜜蜂。 1 案例介绍 CherryStudio …

​信创环境元宇宙应用:3种虚拟团队管理工具前瞻测评

随着信息技术的不断发展,信创环境下的元宇宙应用正逐渐成为各行业关注的焦点。在这个虚拟的世界中,虚拟团队的管理变得至关重要。本文将对三种虚拟团队管理工具进行前瞻测评,探讨它们在信创环境元宇宙应用中的优势和潜在挑战。 信创国产化项目管理解决方案 禅道是一款国产的…

VSCode+Linux+GCC编译运行数据结构的C语言程序集

背景 学习数据结构,写了很多C语言程序,这些C语言程序都保存在一个Git仓库中,以章节、实验内容为目录存放,形如:之前一直是通过gcc命令手动编译、运行,但随着程序逐渐复杂,希望简化构建过程,做到一键编译运行,同时支持断点调试。 环境VSCode,安装了C/C++扩展 Linux GC…

​信创项目管理认证解析:从SAFe到PMBOK的5大适配要点

在当今数字化时代,信创项目管理的重要性日益凸显。SAFe(Scaled Agile Framework,规模化敏捷框架)和 PMBOK(Project Management Body of Knowledge,项目管理知识体系)作为两种广泛应用的项目管理方法,如何实现它们之间的适配,以更好地推动信创项目的成功实施,是一个值…

mybatis如何使用注解方式,不使用xml

前言 大家好,我是小徐啊。我们在使用springboot开发的时候,一般是结合mybatis来使用的。而且,我们一般使用mybatis的时候,都是使用xml的文件。 不过,我之前在开发的时候,遇到了使用xml怎么也读取不到,可能是哪里配置的问题。这个时候,我就想到了使用注解的方式写sql,不…

SHP转WKT文件工具

SHP转WKT文件工具 *.shp转成wkt文件工具:将shp数据的图形转换成wkt工具 参数配置:param.yml设置shape路径,路径参数设置:shapeFile: “你的路径”;注:路径请使用"\\"或者’/’ ;避免使用含中文的路径示例: shapeFile: “C:/Users/Administrator/Desktop/wm/wm.s…

美标插头:插片一大一小,上面带孔

过年期间我遇到了一个刚从美国留学回来的朋友,正好在家无聊,我就让她给我讲讲在美国发生的事情,她告诉我去美国一定要带转换插座,因为那边的插头和国内的不一样,插头上的插片一大一小,可以说是很畸形了,可这是为什么呢?她说她刚开始也不懂,后来查了资料才知道,这是因…

MATLAB R2024b 安装教程

MATLAB R2024b 安装教程 软件介绍 MATLAB 是由 “Matrix” 和 “Laboratory” 两个词组合而成,意为“矩阵工厂”,是一款专注于科学计算、数据可视化和交互式程序设计的高科技计算环境。MATLAB 集成了数值分析、矩阵计算、科学数据可视化以及非线性动态系统建模和仿真等强大功…

手把手教如何将若依前后端分离项目在Tomcat下部署教程

如果你想在Tomcat单独部署诺依项目,前提你要配置好诺依相关的环境,比如安装jdk,mysql,redis,maven等环境,并且开发工具能够正常把项目跑起来,部署可自行去诺依官网查看相关教程。 接下来将详细讲解诺依项目部署在Tomcat下运行相关操作:后端部署1.打开开发工具,修改配置与打…

ASE40N25-ASEMI电动工具专用ASE40N25

ASE40N25-ASEMI电动工具专用ASE40N25编辑:ll ASE40N25-ASEMI电动工具专用ASE40N25 型号:ASE40N25 品牌:ASEMI 封装:TO-247 批号:最新 最大漏源电流:40A 漏源击穿电压:250V RDS(ON)Max:70mΩ 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道MO…

使用echarts创建一个进度条,怎么设置流光效果

使用echarts创建一个进度条,怎么设置流光效果1.引言: 相信大家做大屏都会用到echarts,但是我们是否能把他做些动画效果呢? 那么今天就来介绍一个bar进度条的流光效果。 2.制作过程: 首先:第一步我们先来制作一个进度条:option = {xAxis: {show: false,max: 1,},yAxis: {…

【快速判断是否存在利器】布隆过滤器和布谷鸟过滤器

从入门到精通:布隆过滤器和布谷鸟过滤器 在计算机科学领域,过滤器(Filter)是一种用于快速判断元素是否属于某个集合的数据结构。布隆过滤器(Bloom Filter)和布谷鸟过滤器(Cuckoo Filter)是两种常用的概率型过滤器,它们以高效的空间利用率和查询速度著称,广泛应用于缓…