SWIFT: 将字节从 NSData 粘贴到 Struct?
SWIFT: Paste Bytes from NSData to Struct?
我正在编写用于 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 object,它有 8 + 8 + 84 位,分别是 header、类型和 devSN。因此,如果我使用这些位(或字节)并使用类似以下内容的指针使它们成为指针:
// swift code
fun dataBYtesToPointer(incomingDataPacket: NSData){
var packetBytes = UnsafePointer<UInt8>(incomingDataPacket.bytes)
}
是否有任何方法可以复制指向结构的指针并根据分配给它们的大小正确填充结构变量 header、类型和 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 文件中导出此函数签名并将其导入桥接 header 以便 Swift 代码可以访问它。
在您的 swift 代码中,您可以将其称为:
let bytes = UnsafePointer<UInt8>(incomingDataPacket.bytes)
commandFromData(bytes)
我正在编写用于 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 object,它有 8 + 8 + 84 位,分别是 header、类型和 devSN。因此,如果我使用这些位(或字节)并使用类似以下内容的指针使它们成为指针:
// swift code
fun dataBYtesToPointer(incomingDataPacket: NSData){
var packetBytes = UnsafePointer<UInt8>(incomingDataPacket.bytes)
}
是否有任何方法可以复制指向结构的指针并根据分配给它们的大小正确填充结构变量 header、类型和 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 文件中导出此函数签名并将其导入桥接 header 以便 Swift 代码可以访问它。
在您的 swift 代码中,您可以将其称为:
let bytes = UnsafePointer<UInt8>(incomingDataPacket.bytes)
commandFromData(bytes)