如何使用字节数组在Swift中初始化struct对象?

问题描述 投票:0回答:1

首先,我来自C编程背景。我的系统由使用C语言编写的软件的设备组成,该软件利用蓝牙与iPhone应用程序对话。我在C设备上定义了一个结构,该结构通过蓝牙逐字节发送,并且正在尝试在Swift中重建该结构。

在C语言中,我将使用一个指向字节数组的指针,并将其类型转换为我的自定义结构类型的指针:

uint8_t arrayOfBytes[16];

CustomStructType_t * structPtr = (CustomStructType_t *)arrayOfBytes;

在C中,这很简单。我有一个字节数组,但是我使用类型转换将其表示为自定义结构。

现在在iPhone上,我使用Core Bluetooth捕获传入的Bluetooth字节。更新特性后,以下行接受蓝牙数据包,并将其从数据类型转换为字节字符串。

let incomingByteString = String(data: receivedBluetoothDataPacket, encoding: String.Encoding.utf8)

老实说,我很迷失。我想使用此数据包来初始化或更新struct对象的值,可以说:

struct CustomStruct {
  let name: String!
  let value: Int
}

如果我能告诉Swift,这很不错,嘿,我想让你从这个incomingByteString中创建一个CustomStruct对象。

看起来这真是一个痛苦,我可能需要对输入的数据包进行不同的格式化以适应Swift。任何建议表示赞赏。

swift pointers struct bluetooth byte
1个回答
0
投票

尝试一下

let bytes: [UInt8] = //get your bytes here
let customStruct = bytes.withUnsafeBufferPointer {
    ($0.baseAddress!.withMemoryRebound(to: CustomStruct.self, capacity: 1) { $0 })
}.pointee

您必须将receivedBluetoothDataPacket转换为[UInt8],而您没有提供确切的类型。

假设它是Data,简单的[UInt8](receivedBluetoothDataPacket)就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.