如何在Swift中读取3个字节中的19bit?

问题描述 投票:0回答:1

我有一个从BLE设备获取的20字节的数据对象。

这是当我po CBCharacteristic中的数据时的示例:

▿ 20 bytes
  - count : 20
  ▿ pointer : 0x0000000282889ab0
    - pointerValue : 10779925168
  ▿ bytes : 20 elements
    - 0 : 16
    - 1 : 0
    - 2 : 0
    - 3 : 21
    - 4 : 0
    - 5 : 0
    - 6 : 20
    - 7 : 3
    - 8 : 87
    - 9 : 154
    - 10 : 3
    - 11 : 88
    - 12 : 204
    - 13 : 20
    - 14 : 255
    - 15 : 197
    - 16 : 7
    - 17 : 159
    - 18 : 56
    - 19 : 122 

现在我有指令告诉我,在字节1,2,3上有我正在寻找的19位信号(0-524288)

那么我如何获得该信号值?

如果有必要,我将很高兴阅读有关如何独自获得此材料的材料。我没有适当的CS背景,我迷失于如何/在何处寻找它。

谢谢

swift bit-manipulation byte core-bluetooth
1个回答
0
投票

由于数据来自多个字节,答案取决于协议隐含的endianness。这19位使用2个完整字节,第3个字节中使用3位。

如果这三个字节存储在无符号的8位变量abc中,则值为其中一个

((int)a) << 11 + ((int)b) << 3 + (c & 0x07)

((int)c) << 11 + ((int)b) << 3 + (a & 0x07)

a bc的值取决于字节1、2和3或字节3、2、1,具体取决于协议中指定的顺序。

注:表达式x & 0x07表示“低三位”,因为0x07十六进制为00000111二进制。

© www.soinside.com 2019 - 2024. All rights reserved.