在Swift中将原始字节数组转换为Struct



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

我通过蓝牙从ESP32发送数据,它发送一个结构体,看起来像:

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

,将其放入BLE特性中并通知"客户端";(电话连接到它)。
(填充符是未来值的占位符)

数据与characteristic.value!检索,并给我一个256字节的数组,我想转换回一个快速结构体,看起来像:

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

我发现了一些将结构体转换为原始字节的代码片段,以及一些晦涩的代码片段,将整数的原始字节数组转换回仅由UInt8组成的结构体,但不用于混合类型的数据…
有办法吗?或者有其他的方法吗?

编辑:

256字节数组;直接来自ESP32用pCharacteristic->setValue((byte*)&dataRCV, sizeof(dataRCV));发送的数据,并且sizeof(dataRCV)等于256(因为我这样定义结构体)。

在我的swift代码中,当我输入print(characteristic.value!)时,它只在控制台中打印256 bytes;而这个数据就是我想要转换回结构体的。
在C/c++中,可以像这里解释的那样使用memcpy,但是我找不到任何关于如何在Swift中完成它的信息,所以我还没有真正尝试过任何让我更接近我想要做的事情。

我成功了!

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

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

,我创建了一个函数,该函数将接收到的Data从特征转换为合适的结构体并返回它:(基于这里找到的代码)

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)

最新更新