跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • JS 如何将 16 进制的数据转成 ArrayBuffer
未分類
1 12 月 2020

JS 如何将 16 进制的数据转成 ArrayBuffer

JS 如何将 16 进制的数据转成 ArrayBuffer

資深大佬 : ideacco 2

RT,最近在研究蓝牙硬件,通过 Chrome 的 WEB 蓝牙接口实现蓝牙硬件控制的功能,在实现的过程中遇到一个问题, 我们的蓝牙通讯协议上面的命令都是 16 进制的比如: 打开 LED 灯,命令是”0x20″,关闭 LED 是 :“0x21”,通过 web API 接口连接成功后,随便传了一个 str 的命令过去,结果就返回错误信息:

'writeValue' on 'BluetoothRemoteGATTCharacteristic': The provided value is not of type '(ArrayBuffer or ArrayBufferView)  

就是说这个接口只支持传递 ArrayBuffer 的数据,但是我如何将“0x20”这样的 16 进制命令转换成 ArrayBuffer 呢? 我试了几次,发现 ArrayBuffer 内的数据始终是 10 进制的,只能来 V2 求大神指点一二了

大佬有話說 (19)

  • 主 資深大佬 : ideacco

    之前在 nodejs 上,有一个 Buffer.from 的命令,可以直接将 16 进制传到硬件,在原生 js 上有点蒙了。。。

  • 資深大佬 : rekulas

    你用的什么转 new ArrayBuffer(0x20) 试过吗

  • 資深大佬 : rekulas

    如果各种方法都不行我怀疑可能和你的传输数据 encode 方法有关

  • 資深大佬 : aloxaf

    虽然我不会 JS,但我感觉你应该是搞错了什么……

    前几天在一个 Python 群也看到有人问了类似的问题。
    你要知道进制是给人看的,而对于人来说 10 进制是最自然的,所以不管你存进去的是什么,最终都会以十进制展示。

  • 資深大佬 : across

    假设命令是 8 位长度的,这样么?
    const CMD_BTYE_LENGTH = 8;
    const buffer = new ArrayBuffer(CMD_BTYE_LENGTH);
    const cmd = new DataView(buffer, 0, CMD_BTYE_LENGTH);
    cmd.setInt8(0, 0x21);
    console.log(cmd.getInt8(0));

  • 資深大佬 : ccworker

    new Uint8Array([0x21])

  • 資深大佬 : ccworker

    var a = new Uint8Array([0x21])
    a.buffer

  • 主 資深大佬 : ideacco

    @ccworker 感谢回复,a.buffer 打印出来是 33,也就是说变成了 10 进制的了,我想着是 比如 “5A20”,ArrayBuffer 打印出来应该是 [5a,20]

  • 資深大佬 : across

    @ideacco tostring ( 16 )的事。
    该补课字符串格式化了….

  • 主 資深大佬 : ideacco

    @across 主要是 API 要求必须传递 ArrayBuffer 类型。

  • 資深大佬 : aloxaf

    @ideacco 你这问题太过离谱我都不知道该如何向你解释……

    你觉得在 js 里 0x20 == 32 的结果是什么? false ?

  • 主 資深大佬 : ideacco

    @aloxaf 感谢兄弟的回复,我知道在 js 里面 0x20 就是 32 了,可是我这边的 API 要求使用 ArrayBuffer 类型,但是这个类型你 使用 new Uint8Array([0x20]) 结果是它会传给硬件 32,而硬件支持 10 进制的啊.

  • 主 資深大佬 : ideacco

    @aloxaf 上面口误,硬件 不支持 10 进制的命令…

  • 資深大佬 : lscho

    我觉得你应该从传输数据来检查。。。传递 ArrayBuffer 应该需要修改一下传输数据的类型才行,不能用 string 类型

  • 主 資深大佬 : ideacco

    @lscho 有道理啊,我去试一下,谢谢了

  • 資深大佬 : yggd

    参考下这里:
    https://ionicframework.com/docs/native/ble

  • 資深大佬 : ysc3839

    个人怀疑你没搞懂计算机处理数据的方式。
    计算机里面存的都是二进制数据,没有十进制或十六进制。
    你说的“十进制”、“十六进制”是程序为了方便用户阅读,把二进制数据转换成十进制或十六进制的字符串,再显示出来。

    个人建议你提供这个硬件的文档或者示例代码,目前的信息太少,无法知道具体该如何解决。

  • 主 資深大佬 : ideacco

    @yggd 非常感谢参考的文档,已经顺利解决

  • 主 資深大佬 : ideacco

    @ysc3839 感谢回复,的确是因为自己水平有限,并且还没仔细读文档

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具