首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArrayBuffer中心

ArrayBuffer中心
EN

Stack Overflow用户
提问于 2020-05-26 10:30:31
回答 1查看 208关注 0票数 1

使用cordova BLE中心和Ionic,我试图写(withoutResponse)。

根据文档,数据格式是ArrayBuffer。

从数据包分析中,我知道写的值应该是02FD 1600 0000 0000 002E 1481 1F8F 7500 0000 004D

我的问题是如何使用ArrayBuffer创建所需的JavaScript?

我试过了

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-26 10:51:32

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

这个ArrayBuffer不能保证与原始缓冲区完全对应。有关详细信息,请参阅buf.byteOffset上的说明。

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

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

代码语言:javascript
复制
buf=Buffer.from("02FD160000000000002E14811F8F75000000004D",'hex')
data=buf.buffer.slice(buf.byteOffset,buf.byteOffset+buf.length)

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

通过使用ArrayBuffer获取TypedArray。这在浏览器中是可行的:

代码语言:javascript
复制
    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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62020071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档