如何在swift中从十六进制值创建NSData

时间:2015-10-06 18:01:33

标签: ios swift

我是一个快速/ 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对象?

2 个答案:

答案 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表示。