Swift 3如何将结构存储在"数据"对象

时间:2016-10-29 05:06:31

标签: struct

什么是"权利"将任意奇数大小的结构填充到swift 3 Data对象中的方法? 我认为我已经到了那里,但对于之前的经验不是

,它似乎非常令人费解
  dataObject.append(&structInstance, sizeof(structInstance))

我的情况如下:

感兴趣的结构:

public struct  CutEntry {
  var itemA  : UInt64
  var itemB  : UInt32
}

我想要以特定的方式填充数据对象,因为数据对象成为最终由不同体系结构上的不同应用程序读取的文件。

将它们放入Data对象的函数

  open func encodeCutsData() -> Data
  {
    var data = Data()
    for entry in cutsArray
    {
      // bigendian stuff, as a var, just so the you can get the address
      var entryCopy = CutEntry(itemA: entry.itemA.bigEndian, itemB: entry.itemB.bigEndian)
      // step 1 get the address of the item as a UnsafePointer
      let d2 = withUnsafePointer(to: &entryCopy) { return $0}
      // step 2 cast it to a raw pointer
      let d3 = UnsafeRawPointer(d2)
      // step 3 create a temp data object
      let d4 = Data(bytes:d3, count: MemoryLayout<CutEntry>.size )
      // step 4 add the temp to main data object
      data.append(d4)
    }
    return data
  }

早些时候我们只有NSMutableData,那是

    let item = NSMutableData()

    for entry in cutsArray
    {
      var entryCopy = CutEntry(cutPts: entry.cutPts.bigEndian, cutType: entry.cutType.bigEndian)
      item.append(&entryCopy, length: MemoryLayout<CutEntry>.size)
   }

我花了几个小时搜索操作struct和Data对象的例子。当我发现对unsafebufferpointer的引用时,我感觉很接近。当我发现&#34;缓冲区&#34; bit使用核心内存对齐(这可能很有用)并且它将16个字节填充到数据对象中而不是预期的12个。

我已经准备好说我错过了某个地方明显的RTFM。谁能提供更清洁的解决方案?或者斯威夫特真的倒退了吗?

如果我能找到一种方法来获取指向该项目的指针作为UInt8指针,这将删除几行,但这看起来很难。

1 个答案:

答案 0 :(得分:0)

通过查看reference of Data,我可以找到两件对您有用的内容:

init(bytes: UnsafeRawPointer, count: Int)

func append(Data)

你可以这样写:

var data = Data()
for entry in cutsArray {
    var entryCopy = CutEntry(cutPts: entry.cutPts.bigEndian, cutType: entry.cutType.bigEndian)
    data.append(Data(bytes: &entryCopy, count: MemoryLayout<CutEntry>.size))
}