如何在 Swift 3 中从数据中提取 Int16

Posted

技术标签:

【中文标题】如何在 Swift 3 中从数据中提取 Int16【英文标题】:How to extract Int16 from Data in Swift 3 【发布时间】:2016-10-26 22:48:46 【问题描述】:

几天来,我一直在尝试访问 BLE 服务特征值中的数据。我认为弄清楚如何将 Temperature Sensor 示例翻译成 Swift 会有所帮助,但我还是被困在了同一个地方。

如何翻译 Obj-C:

- (CGFloat) maximumTemperature

    CGFloat result  = NAN;
    int16_t value   = 0;

    if (maxTemperatureCharacteristic) 
        [[maxTemperatureCharacteristic value] getBytes:&value length:sizeof (value)];
        result = (CGFloat)value / 10.0f;
    
    return result;

到 Swift 3?

在我的代码中,我使用的是结构而不是 CGFloat:

struct MPUData 
    let x: Int16
    let y: Int16
    let z: Int16

并且正在从特征中接收一个 8 字节值,其中前六个是 x、y 和 z 分量(即0x0D0E0F00,其中x = 0x0Dy = 0x0Ez = 0x0F,最后一个字节未使用)

我不知道如何遍历这些位并将它们存储为它们的 Int16 值。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

尝试使用withUnsafeBytes

//Assuming `data` as `someCharacteristic.value!`
//Create 4 Int16 data in little endian
let data = Data(bytes: [0x0D, 0, 0x0E, 0, 0x0F, 0, 0, 0])

struct MPUData 
    let x: Int16
    let y: Int16
    let z: Int16

let mpuData = data.withUnsafeBytes (int16Ptr: UnsafePointer<Int16>)->MPUData in
    MPUData(x: Int16(littleEndian: int16Ptr[0]),
        y: Int16(littleEndian: int16Ptr[1]),
        z: Int16(littleEndian: int16Ptr[2]))

print(mpuData.x,mpuData.y,mpuData.z) //->13 14 15

【讨论】:

我唯一要补充的是,如果你没有得到预期的缓冲区大小,我会把它放在一个 init?(data: Data) 构造函数中,并返回 nil,因为这通常是表明您的数据有误:guard data.count == MemoryLayout.size * 3 else return nil 看起来这行得通。希望我今天有机会测试/投票。

以上是关于如何在 Swift 3 中从数据中提取 Int16的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中从数组中提取随机项?

如何在 Swift 中从同一站点重新加载新的 JSON 数据?

在 Swift 3 中从数组中播放随机声音

如何在 swift 3 中从核心数据中删除对象

在 Swift 中从字符串中提取某些文本

在 Flutter/Dart 中从 JSON 数组中提取数据