ios - 从 BLE 提取 NSData 并将其转换为 Swift 中的 Float

标签 ios swift floating-point type-conversion nsdata

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

在 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 objective-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 超出了 fescratchVal [0] 在 ObjectiveC 中大约是 64

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

现在我使用 TI 的原始 Objective C 代码与我们的 SensorTag 一起使用,但我更愿意为应用程序中的每个部分使用 Swift。

最佳答案

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

另一方面,

ByteUInt8 的别名,未签名。 使用 [Int8] 数组来获得与 Objective-C 代码中相同的行为。

关于ios - 从 BLE 提取 NSData 并将其转换为 Swift 中的 Float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26326415/

相关文章:

ios - 无法使用 AVAssetTrackReaderOutput 在 while 循环中更新 UIViewImage

Swift tableView 单元格在滚动时消失

swift - 在所有 View 中使用相同的标题

C++:从一串 float 中获取单个浮点值

c - 如何卸载不间断(浮点异常时继续)模式?

objective-c - 如何使用 UIImage 加载 16 位图像?

ios - 在 Swift 中覆盖 UIScrollView 的委托(delegate)属性(就像 UICollectionView 一样)

ios - 如何在 UINavigationController 中获得弹出 View 的通知?

ios - iPhone XR 返回正确的 nativeBounds 但设备上的屏幕尺寸错误

floating-point - 哪些单精度 float 需要 9 位有效小数位才能明确表示十进制数?