如何访问映射为快速结构的内存缓冲区?

时间:2019-05-08 01:08:14

标签: c swift pointers struct unsafemutablepointer

这对您来说可能是微不足道的,但是我是Swift的新手,所以找不到答案。我使用C代码从TCP / IP转换数据,一切正常。但是,当我尝试将数据发送回Swift时,出现错误: 类型'UnsafeMutablePointer'的值没有成员'x' (在编译时)。

简单地说,我的C代码生成一个结构,我希望我的快速代码读取该结构并使用一种结构来访问字段。 注意:我不想复制数据(这里的示例很简单,但我处理的是MB(MB)。

override func viewDidLoad()
{
  struct MyStruct1
  {
    var x   : UInt32        
    var y   : UInt32
  }
  var buffer : UnsafeMutablePointer<UInt8>?
  //...
  buffer = UnsafeMutablePointer<UInt8>.allocate( capacity: Int(1024) )
  if (buffer != nil)
  {
     defer { buffer!.deallocate() }
     // CCode_That_Initializes_Buffer( buffer ) with An array of MyStruct
     var myStructP : UnsafeMutablePointer<MyStruct1>
     myStructP = UnsafeMutableRawPointer(buffer!).assumingMemoryBound(to: MyStruct1.self)
     // Value of type 'UnsafeMutablePointer<MyStruct1>' has no member 'x'
     print( myStructP.x ) // <= This does not compile
  }
}

1 个答案:

答案 0 :(得分:0)

如果不进行复制,则不能将作为不安全原始指针分配的缓冲区映射到Swift结构变量中。

Swift结构变量具有其他语言属性,因此,如果该变量已由Swift分配为相同的结构类型,则您只能通过指针访问Swift结构变量的内容(例如,不作为传递给它的不安全的指针)通过C)。

相反,您也许可以编写访问器函数,该函数使用每个Swift结构元素的偏移量和大小从绑定到所需类型变量的偏移量原始指针读取和写入字节。

或者只是通过桥接头使用C结构。