【问题标题】:Converting a raw byte array to Struct in Swift在 Swift 中将原始字节数组转换为 Struct
【发布时间】:2021-05-05 04:59:03
【问题描述】:

我正在开发一种通过蓝牙将数据发送到自定义应用程序的产品。
虽然我的通信链接正常工作,但我似乎找不到将原始数据转换为结构的解决方案。

我正在通过蓝牙从 ESP32 发送数据,它发送的结构如下:

struct dataStruct {
  float value = 0.45;
  int temp = 23;
  byte filler[250];
} dataRCV;

,将其置于 BLE 特性中并通知“客户端”(与其连接的手机)。
(填充符是未来值的占位符)

使用characteristic.value! 检索数据,并给我一个 256 字节的数组,我想将其转换回一个 swift 结构,如下所示:

struct dataStruct {
    var value: Float
    var temp: UInt16
    var filler: [UInt8]
}

我发现了一些用于将结构转换为原始字节的代码 sn-ps,以及一些用于将整数的原始字节数组转换回仅由 UInt8 组成的结构的代码 sn-ps,但不适用于混合类型的数据...
有什么办法吗?或者有没有其他方法可以做到这一点?

编辑:

“256 字节数组”直接来自带有 pCharacteristic->setValue((byte*)&dataRCV, sizeof(dataRCV)); 的 ESP32 发送的数据,而 sizeof(dataRCV) 等于 256(因为我以这种方式定义了结构)。

当我在我的swift代码中print(characteristic.value!)时,它只会在控制台中打印256 bytesthis 数据是我想要转换回结构的数据。
在 C/C++ 中,使用 memcpy as explained here 是可能的,但我找不到任何关于如何在 Swift 中完成的信息,所以我还没有真正尝试过任何让我更接近我想做的事情。

【问题讨论】:

  • 256 字节数组太模糊。您需要发布这些字节含义的详细信息。 Float 只需要 4 个字节,UInt16 需要 2 个字节,[UInt8] 可以是任意大小。顺便说一句int temp = 1.70 没有任何意义。
  • 欢迎来到 SO 但请注意,这不是代码编写服务。您应该发布您尝试过的内容以及您面临的问题。
  • @LeoDabus 谢谢!我知道,我现在就补充。
  • 编辑您的帖子并澄清您的问题
  • @LeoDabus 好点了吗?

标签: arrays swift struct type-conversion byte


【解决方案1】:

我搞定了!

swift 代码中的结构体定义为:

struct dataStruct {
    var value = Float(0.0)
    var temp = UInt16(0)
    var filler = [UInt8](repeating: 0, count: 248)
}

,我创建了一个函数,将接收到的Data 从特征转换为合适的结构并返回它:(based on code found here)

func dataToStruct(data: Data) -> dataStruct {
    let _data = data
    let converted:dataStruct = _data.withUnsafeBytes { $0.load(as: dataStruct.self) }
    return converted
  }
}

我现在可以调用此函数将收到的原始数据转换为可用的数据! :

  var receivedParsed = dataToStruct(data: characteristic.value!)
  print(receivedParsed.value)

【讨论】:

  • 这不适用于fillerload 仅填充值类型,而不是动态分配的数据,例如支持 Array 的缓冲区
  • @RobertCrabtree 有没有可行的方法?
猜你喜欢
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多