首先,我来自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。任何建议表示赞赏。
尝试一下
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)
就足够了。