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