SWIFT:将NSData中的字节粘贴到Struct?

时间:2016-02-23 03:06:09

标签: swift pointers struct byte nsdata

我正在编写一个蓝牙数据包协议,用于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 variables头,类型和devSN?在C中,您将使用memcopy并将该指针复制到结构。因此,我不知道如何使用预定义的大小制作结构,如示例中所示,并且我不知道如何用指针填充它。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你可以想到一个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)