在Swift中将NSData从BLE提取并转换为Float

时间:2014-10-12 14:53:52

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

我正在开发一个处理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。

2 个答案:

答案 0 :(得分:1)

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

另一方面,

ByteUInt8的别名, 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]));

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