我正在编写用于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)

10-05 20:20
查看更多