Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWIFT:将字节从NSData粘贴到结构?_Swift_Pointers_Struct_Byte_Nsdata - Fatal编程技术网

SWIFT:将字节从NSData粘贴到结构?

SWIFT:将字节从NSData粘贴到结构?,swift,pointers,struct,byte,nsdata,Swift,Pointers,Struct,Byte,Nsdata,我正在为iPhone和外围设备之间的通信编写蓝牙数据包协议。设备将向我发送一些位,可能是128位或256位,我使用的通信协议将允许我作为NSData变量访问这些传入数据。我的问题是,我可以从NSDATA获取字节,还是直接使用NSDATA将字节粘贴到具有预定义大小的条目的结构中?例如,在C中,您将有一个类似以下的结构: struct CD2_CONFIG_TYPE { uint8_t header; // '<' or '>' start of a ne

我正在为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 
};
struct CD2\u CONFIG\u类型{
uint8_t头;/''从设备或基站开始新数据包
uint8_t type;//“c”表示设备配置数据包
uint8_t devSN[8];//设备序列号
};
假设我们收到的数据是一个NSData对象,它有8+8+84位,分别是头、类型和devSN。因此,如果我将这些位(或字节)作为指针,使用如下方式:

// swift code    
fun dataBYtesToPointer(incomingDataPacket: NSData){
         var packetBytes = UnsafePointer<UInt8>(incomingDataPacket.bytes)
    }
//swift代码
趣味数据字节指针(incomingDataPacket:NSData){
var packetBytes=UnsafePointer(incomingDataPacket.bytes)
}

有没有办法复制指向结构的指针,并根据分配给它们的大小正确填充结构变量header、type和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代码可以访问此签名

在swift代码中,您可以将其称为:

let bytes = UnsafePointer<UInt8>(incomingDataPacket.bytes)
commandFromData(bytes)
let bytes=UnsafePointer(incomingDataPacket.bytes)
commandFromData(字节)

我想你的问题的答案就在这里。谢谢@Shripada的回答。我不知道你能把C代码和斯威夫特一起用。我让它工作了,但我没有使用您给我的函数的第2行、第3行和第4行,而是使用memcpy(&command,&data,sizeof(command));它一次将整个指针复制到结构。我非常感谢你的帮助,很高兴你的帮助。是的,你复制的方式也是合法的。