为了账号安全,请及时绑定邮箱和手机立即绑定

BLE 中央阵列缓冲区

BLE 中央阵列缓冲区

蛊毒传说 2022-09-02 21:33:19
使用Cordova BLE central和Ionic,我正在尝试编写(没有Response)。根据文档,数据格式是ArrayBuffer。从数据包分析中我知道写入的值应该是02FD 1600 0000 0000 002E 1481 1F8F 7500 0000 004D我的问题是如何使用JavaScript创建所需的ArrayBuffer?我试过Buffer.from("02FD 1600 0000 0000 002E 1481 1F8F 7500 0000 004D").buffer但是当我检查交换的数据包时,写入的值为3032 4644 2031 3630 3020 3030 3030 2030 3030 3020 3030 3245 2031 3438 3120 3146 3846 2037 3530 3020 3030 3030 2030 3034 44
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

https://nodejs.org/api/buffer.html#buffer_buf_buffer


此 ArrayBuffer 不保证与原始缓冲区完全对应。有关详细信息,请参阅 buf.byteOffset 上的注释。


底层 ArrayBuffer 中的缓冲区数据从.byteOffset


您还为Buffer.from读取的十六进制字符串使用了错误的格式,并且您还需要告诉它使用“十六进制”编码(默认值为“utf-8”)。它不理解空格(也不理解16位值的概念,这将是TypedArrays和.readInt16BE以及其他实用程序函数的工作)。


buf=Buffer.from("02FD160000000000002E14811F8F75000000004D",'hex')

data=buf.buffer.slice(buf.byteOffset,buf.byteOffset+buf.length)

我不知道你从哪里得到这些数据,但它看起来像16位值。您必须确保数据的字节序,以确保字节不需要交换。


通过使用 TypedArray 获取 ArrayBuffer。这适用于浏览器:


    data = new Uint16Array("02FD 1600 0000 0000 002E 1481 1F8F 7500 0000 004D"

     .split(' ').map(x=>parseInt(x,16)))

    

    console.log([...data].map(x=>x.toString(16).padStart(4,'0')).join(''))

    

    buf = data.buffer; //ArrayBuffer


查看完整回答
反对 回复 2022-09-02
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信