我正在开发一个处理BlueTooth SensorTag的IOS应用程序。 SensorTag基于TI BLE SensorTag,但我们删除了一些传感器。
在TI的原始IOS应用程序的源代码中,XYZ值的计算如下 KXTJ9_RANGE在我的实现中定义为1.0,KXTJ9是在SensorTag上构建的Accelerometer
+(float) calcXValue:(NSData *)data {
char scratchVal[data.length];
[data getBytes:&scratchVal length:3];
return ((scratchVal[0] * 1.0) / (64 / KXTJ9_RANGE));
}
数据以十六进制形式出现,例如" fe850d"并将该方法分为3部分。 现在我试图将此方法转换为swift,但我得到了错误的数字
e.g。 fe
应该返回0.02
目标C代码所做的事情
我的Swift Code到目前为止
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中的{{1}}大约为64
但是我的主要问题是,当我不得不开始这个项目时,我对IOS编程都很陌生,所以我选择使用Swift来学习和编写应用程序。
现在我使用TI的原始Objective C代码与我们的SensorTag一起使用,但我更喜欢在应用程序的每个部分使用Swift。
答案 0 :(得分:1)
在所有当前的iOS和OS X平台上,char
是签名的数量,
以便将输入fe
视为负数。
Byte
是UInt8
的别名, unsigned 。
请使用[Int8]
数组来获得与Objective-C代码相同的行为。
答案 1 :(得分:0)
它取决于BLE设备的Endianness,与您的设备Endianness有关。 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]));
在解析数据时检查哪一个更有意义。