Swift - 将数据转换为十进制值

DCD*_*CDC 6 hex ios core-bluetooth swift

我通过BLE获取数据,我想将它们转换为十进制值,但我怀疑我做错了,因为值范围似乎不正确

来自BLE,我收到了 characteristic.value

24ffa400 6d08fcff fffffbff 0d001500 5eff

它是由IMU值构成的.

当我尝试转换前两个字节时,在这个例子24ff中是加速度计X轴值,我从范围1000-30000得到一个值(我向传感器引入了一些动态运动,看看值是如何变化的).

这一定是错的,因为文档说加速计的规模是±16G 有两个更重要的信息:

帧中的字节序列如下:[LSB,MSB]

值为16位,使用二进制补码

这是我如何将数据转换为十进制值:

class func getAccelerometerData(value: NSData) -> [String] {

    let dataFromSensor = dataToSignedBytes8(value)
    let bytes:[Int8] = [dataFromSensor[1], dataFromSensor[0]]

    let u16 = UnsafePointer<Int16>(bytes).memory
    return([twosComplement(u16)])
}

class func twosComplement(num:Int16) -> String {
    var numm:UInt16 = 0
    if num < 0 {
        let a = Int(UInt16.max) + Int(num) + 1
        numm = UInt16(a)
    }
    else { return String(num, radix:10) }
    return String(numm, radix:10)
}
Run Code Online (Sandbox Code Playgroud)

我想我应该从范围<-16:16>获得值而不是上面提到的巨大值,我的方法有什么问题?

提前致谢

编辑:缺少方法实现

class func dataToSignedBytes8(value : NSData) -> [Int8] {
    let count = value.length
    var array = [Int8](count: count, repeatedValue: 0)
    value.getBytes(&array, length:count * sizeof(Int8))
    return array
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 2

给定一些NSData,

let value = NSData(bytes: [0x24, 0xff, 0xa4, 0x00] as [UInt8], length: 4)
print(value) // <24ffa400>
Run Code Online (Sandbox Code Playgroud)

您可以按 [LSB, MSB] 顺序检索前两个字节作为有符号 16 位整数

let i16 = Int16(littleEndian: UnsafePointer<Int16>(data.bytes).memory)
print(i16) // -220
Run Code Online (Sandbox Code Playgroud)

该数字在范围内-32768 .. 32767,必须根据设备规范缩放到浮点范围,例如:

let scaled = 16.0 * Double(i16)/32768.0
print(scaled) // -0.107421875
Run Code Online (Sandbox Code Playgroud)

scaled是 a并且可以使用 , 或使用 aDouble转换为字符串 。String(scaled)NSNumberFormatter