我是一个快速/ iOS新手,我有一个问题需要解决。 我试图从Texas Instrument SensorTag 2获取数据。要按照说明激活传感器,我必须在传感器的配置库中写一个二进制字符串。
我有这段代码:
if SensorTag.validConfigCharacteristic(thisCharacteristic) {
// Enable Sensor
let enableByte = SensorTag.getEnableByteFor(thisCharacteristic)
self.sensorTagPeripheral.writeValue(enableByte, forCharacteristic: thisCharacteristic, type: CBCharacteristicWriteType.WithResponse)
}
我编写函数来获取要写入的值。 enableByte
类型是NSData。
class func getEnableByteFor(thisCharacteristic: CBCharacteristic) -> NSData {
print(thisCharacteristic.UUID)
var enableValue = 0
if thisCharacteristic.UUID == MovementConfigUUID {
enableValue = ...
} else { // any other activation
enableValue = 1
}
return NSData(bytes: &enableValue, length: sizeof(UInt8))
}
对于每个传感器,如果我想启用传感器,我必须写1,如果我想禁用它,则需要写0,但是对于运动传感器,我必须根据this guide 16位(2字节)写入。对于我的配置,我必须写二进制值0000000001111111,0x007F。如何初始化值为0x007F的NSData对象?
答案 0 :(得分:1)
试试这个:
let bytes : [CChar] = [0x0, 0x7F]
let data = NSData(bytes: bytes, length: 2)
NSData(bytes:length:)
从字节流创建NSData
对象。在Objective-C中,此字节流的类型为char *
。 Swift equivalent为[CChar]
。问题(和另一个答案)使用Int
来表示此字节流。 这是错误和危险的。
var enableValue = 0 // enableValue is a 64-bit integer
NSData(bytes: &enableValue, length: sizeof(UInt8)) // this trims it to the first 8 bits
它的工作原理是因为x86使用Little Endian编码,它将最低有效字节放在第一位。它将在使用Big Endian的PowerPC上失败。 ARM使用可切换的字节序,因此可能会或可能不会在那里失败。当情况需要精确的位布局时,您不应该依赖于架构的字节序:
class func getEnableByteFor(thisCharacteristic: CBCharacteristic) -> NSData {
print(thisCharacteristic.UUID)
let enableValue : [CChar]
if thisCharacteristic.UUID == MovementConfigUUID {
enableValue = [0x0, 0x7F]
} else { // any other activation
enableValue = [0x1]
}
return NSData(bytes: enableValue, length: enableValue.count)
}
答案 1 :(得分:-1)
考虑字节顺序的更短的解决方案:
NSData(bytes: [UInt16(0x007F).bigEndian], length: 2)
现在使用[UInt16]
作为字节流没有任何问题,因为UInt16
具有bigEndian
属性,如果需要,它返回整数更改字节顺序的big-endian表示。