我正在编写用于iPhone和外围设备之间通信的蓝牙数据包协议。设备将向我发送一些位,可能为128或256,并且我正在使用的通信协议将使我可以将这些传入数据作为某些NSData变量来访问。我的问题是,我可以从NSDATA中获取字节还是以某种方式直接使用NSData将字节粘贴到具有预定义大小的条目的结构中?例如,在C语言中,您将具有以下结构:
struct CD2_CONFIG_TYPE {
uint8_t header; // '<' or '>' start of a new packet from device or base station
uint8_t type; // 'c' indicates device configuration packet
uint8_t devSN[8]; // device serial number
};
假设我们收到的数据是一个NSData对象,它具有8 + 8 + 84位,分别是标头,类型和devSN。因此,如果我使用这些位(或字节)并使用类似以下内容的指针作为指针:
// swift code
fun dataBYtesToPointer(incomingDataPacket: NSData){
var packetBytes = UnsafePointer<UInt8>(incomingDataPacket.bytes)
}
有什么方法可以将指针复制到struct并根据分配给它们的大小正确填充struct变量的标头,类型和devSN?在C语言中,您将使用memcopy并将该指针复制到一个结构。因此,我不知道如何像示例中那样使用预定义的大小来构造结构,也不知道如何用指针填充它。任何帮助,将不胜感激。
最佳答案
您可以想到一个C方法,如下所示:
struct CD2_CONFIG_TYPE* commandFromData(uint8_t * data){
struct CD2_CONFIG_TYPE* command = (struct CD2_CONFIG_TYPE*)malloc(sizeof(struct CD2_CONFIG_TYPE));
command->type = data[0];
command->header = data[1];
memcpy(command->devSN, &data[2], 8* sizeof(uint8_t));
return command;
}
您可以将此函数签名导出到.h文件中,然后将其导入到桥接头文件中,以便Swift代码可以访问它。
在您的快速代码中,您可以将其称为:
let bytes = UnsafePointer<UInt8>(incomingDataPacket.bytes)
commandFromData(bytes)