我正在开发一个处理蓝牙 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
超出了 fe
而 scratchVal [0]
在 ObjectiveC 中大约是 64
但我的主要问题是,当我不得不开始这个项目时,我对 IOS 编程完全陌生,所以我选择使用 Swift 来学习和编写应用程序。
现在我使用 TI 的原始 Objective C 代码与我们的 SensorTag 一起使用,但我更愿意为应用程序中的每个部分使用 Swift。
最佳答案
在所有当前的 iOS 和 OS X 平台上,char
是一个signed 数量,
以便输入 fe
被视为负数。
Byte
是 UInt8
的别名,未签名。
使用 [Int8]
数组来获得与 Objective-C 代码中相同的行为。
关于ios - 从 BLE 提取 NSData 并将其转换为 Swift 中的 Float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26326415/