c - 如何访问映射到 swift 结构的内存缓冲区?

标签 c swift pointers struct unsafemutablepointer

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

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

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
  }
}

最佳答案

您无法将分配为不安全原始指针的缓冲区映射到 Swift 结构变量而不进行复制。

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

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

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

关于c - 如何访问映射到 swift 结构的内存缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56032236/

相关文章:

c - 分配可变数量的可变对象的所有组合

C 程序告诉用户哪个子进程首先完成

c - Boehm GC android sigsegv on load_gc

ios - 为什么这个 OpenGL ES 数组实例化示例不起作用?

ios - iOS 中的周期性本地通知

ios - 如何在由 UITabBarController 分隔的两个 View Controller 之间传递数据?

c++ - 指向虚拟成员函数的指针

c - 如何在C中将结构转换为字节数组?

c - 为什么此 C 代码片段中的 NULL 取消引用不会导致未定义的行为

对未初始化指针指向任何地方的事实感到困惑