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

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 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号