SWIFT:将字节从 NSData 粘贴到 Struct?

Posted

技术标签:

【中文标题】SWIFT:将字节从 NSData 粘贴到 Struct?【英文标题】:SWIFT: Paste Bytes from NSData to Struct? 【发布时间】:2016-02-23 03:06:09 【问题描述】:

我正在为 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)
    

有什么方法可以复制指向结构的指针并根据分配给它们的大小正确填充结构变量标头、类型和 devSN?在 C 中,您将使用 memcopy 并将该指针复制到结构中。所以我不知道如何像示例中那样制作具有预定义大小的结构,也不知道如何用指针填充它。任何帮助将不胜感激。

【问题讨论】:

我想你的问题的答案就在这里。 ***.com/questions/25079380/… 【参考方案1】:

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

【讨论】:

谢谢@Shripada 的回答。我不知道你可以像这样快速使用 C 代码。我让它工作了,但是我没有使用你给我的函数的第 2 行、第 3 行和第 4 行,而是使用了 memcpy(&command, &data, sizeof(command));它一次将整个指针复制到结构中。我非常感谢您的帮助。 很高兴它有帮助。是的,你复制的方式也是合法的。

以上是关于SWIFT:将字节从 NSData 粘贴到 Struct?的主要内容,如果未能解决你的问题,请参考以下文章

从 NSData 字节获取浮点值

在 Swift 中正确地将 -Hex- NSData 形式的 4 个字节读入其正确的数据类型(float 或 int)

NSData init?(contentsOf url: URL) 从 Swift 2 迁移到 Swift 3

将 NSString 转换为 NSData 是不是会强制使用尾随字节?

将 UIImage 转换为 NSData 并在 Swift 中转换回 UIImage?

在 Swift 中将两个字节的 UInt8 数组转换为 UInt16