【问题标题】:Extract and Convert NSData from BLE to Float in Swift在 Swift 中从 BLE 提取和转换 NSData 到 Float
【发布时间】:2014-12-07 05:12:04
【问题描述】:

我正在开发一个处理蓝牙 SensorTag 的 IOS 应用程序。 该 SensorTag 基于 TI BLE SensorTag,但我们删除了一些 Sensor。

在 TI 的原始 IOS 应用程序的源代码中,XYZ 值的计算如下 在我的实现中,KXTJ9_RANGE 定义为 1.0,KXTJ9 是建立在 SensorTag 上的加速度计

+(float) calcXValue:(NSData *)data {
  char scratchVal[data.length];
  [data getBytes:&scratchVal length:3];
  return ((scratchVal[0] * 1.0) / (64 / KXTJ9_RANGE));
}

数据像“fe850d”一样是十六进制的,通过该方法将被分成3部分。 现在我正在尝试将此方法转换为 swift,但我得到了错误的数字

例如fe 应该返回 0.02 目标 C 代码所做的事情

到目前为止我的 Swift 代码

class Sensor: NSObject {
  let Range: Float = 1.0
  var data: NSData
  var bytes: [Byte] = [0x00, 0x00, 0x00]

  init(data: NSData) {
    self.data = data
    data.getBytes(&bytes, length: data.length)
  }

  func calcXValue()->Float {
    return ((Float(bytes[0]) * 1.0) / (64.0 / Range))
  }
...
}

我相信问题一定出在我的Float(bytes[0]) 周围,因为这使得254 脱离fe 而ObjectiveC 中的scratchVal[0] 大约是64

但我的主要问题是,当我不得不开始这个项目时,我对 IOS 编程完全陌生,所以我选择使用 Swift 来学习和编写应用程序。

现在我使用来自 TI 的原始 Objective C 代码与我们的 SensorTag 一起使用,但我更喜欢在应用程序的每个部分使用 Swift。

【问题讨论】:

  • char 是一个 signed 数量,而 Byteunsigned。尝试改用 [Int8] 数组。
  • 谢谢,这就是区别 =)

标签: ios swift floating-point type-conversion nsdata


【解决方案1】:

在所有当前的 iOS 和 OS X 平台上,char 是一个签名数量, 以便输入fe 被视为负数。

另一方面,

ByteUInt8 的别名,无符号。 使用 [Int8] 数组来获得与您的 Objective-C 代码相同的行为。

【讨论】:

    【解决方案2】:

    它取决于 BLE 设备字节序,与您的设备字节序有关。 wiki on Endianness

    为了简单起见,您需要检查两种方法中的哪一种

    NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];
    int value = CFSwapInt32BigToHost(*(int*)([data4 bytes]));
    

    NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];
    int value = CFSwapInt32LittleToHost(*(int*)([data4 bytes]));
    

    并在解析数据时检查哪一个更有意义。

    【讨论】:

      猜你喜欢
      • 2014-09-29
      • 2018-10-12
      • 2016-09-01
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多