【问题标题】:How to convert Data to UnsafePointer<UInt8>?如何将数据转换为 UnsafePointer<UInt8>?
【发布时间】:2023-03-06 04:09:01
【问题描述】:

在 Swift 中,我想将 Data 类型的数据缓冲区(命名为 data)传递给 C 函数(命名为 do_something),该函数采用 UnsafePointer&lt;UInt8&gt; 类型的指针。

下面的代码示例是否正确?如果是这样,在这种情况下可以使用assumingMemoryBound(to:) 而不是bindMemory(to:capacity:) 吗?

data.withUnsafeBytes { (unsafeBytes) in
  let bytes = unsafeBytes.baseAddress!.assumingMemoryBound(to: UInt8.self)
  do_something(bytes, unsafeBytes.count)
}

【问题讨论】:

    标签: swift unsafe-pointers


    【解决方案1】:

    正确的方法是使用bindMemory():

    data.withUnsafeBytes { (unsafeBytes) in
        let bytes = unsafeBytes.bindMemory(to: UInt8.self).baseAddress!
        do_something(bytes, unsafeBytes.count)
    }
    

    assumingMemoryBound() 只能在内存已经绑定到指定类型时使用。

    关于这个主题的一些资源:

    【讨论】:

    • 如果我没记错的话,将Data 转换为[UInt8] 并将其作为指针传递不是更容易吗?
    • @vadian:更容易编码,但在运行时效率较低。它将创建一个额外的(临时)数组。
    • 谢谢,但是你怎么知道内存还没有绑定到UInt8类型呢?
    • @ma11hew28:bindMemory 绑定或重新绑定内存位置,所以它是否已经绑定到 UInt8 无关紧要。这里也有很好的信息:stackoverflow.com/a/47942269/1187415。另请注意,“绑定内存向编译器传达内存位置对于类型化访问是安全的。运行时什么都不会发生——直到有人编写了类型安全清理程序。”
    • 好的。但我希望我的应用程序能够快速运行。你是说即使我(不必要地)将内存重新绑定到它已经绑定的类型,那么我的应用程序将运行得一样快(好像我没有)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多