如何在 Swift 3 中将 [UInt8] 数组复制到 C 指针?

Posted

技术标签:

【中文标题】如何在 Swift 3 中将 [UInt8] 数组复制到 C 指针?【英文标题】:How to copy [UInt8] array to C pointer in Swift 3? 【发布时间】:2016-11-29 06:52:34 【问题描述】:

我正在尝试将 Swift [UInt8] 缓冲区复制到 C 指针。我找不到正确的解决方案,这是我的代码:

uploadBodyBytes = [UInt8]()
...
...
var data = crl.uploadBodyBytes[crl.bodyBytesUploaded..<crl.bodyBytesUploaded+actualLen]

_ = data.withUnsafeBytes( (rawData /*provides UnsafeRawBufferPointer*/) -> UnsafeMutableRawPointer in
    return memcpy(a, rawData /*expected UnsafeRawPointer*/, actualLen)
)

data.withUnsafeBytes 给了我UnsafeRawBufferPointer 但这似乎与memcpy 不兼容,后者需要UnsafeRawPointer

帮助表示赞赏。

【问题讨论】:

你不应该在 Swift 中使用 memcpy。这是不安全和笨重的地狱。相反,您应该使用NSData 而不是[UInt8] 来模拟字节流。它内置了用于制作副本的初始化程序。如果您提供更多有关如何获取这些字节以及您想对它们做什么的上下文,我可以帮助您。 我只是想向现有的 cURL Swift 库添加一些功能。而且他们出于某种原因不使用数据(NSData),而是使用 [UInt8] 缓冲区(甚至不包括 Foundation 库)。我想我应该按照它已经写的方式。不知道为什么 memcpy 会这么笨重? 因为它会让你使用不安全的原始指针 【参考方案1】:

您可以使用baseAddress 属性访问它,但您不需要这样做。

【讨论】:

查看我的编辑。真的没有理由在 Swift 中使用 memcpy :p 但我在 C 回调函数中将 'a' 作为指针。 let readFunc: curl_func = (a, size, num, p) -> Int in ... 不确定a = rawData 是否可行? 哦,真的,我搞混了。这些数据的初始来源是什么,最终目的地是什么?最好将 UnsafeRawBufferPointer 绑定到某种类型,并从中创建一个 Swift 数组。 我已经有一个 [Uint8] 的 Swift 数组,我需要将这些字节复制到作为 C 指针的 'a' ... 例如。 UnsafeMutableRawPointer? 与其先获取指针,再复制,不如先复制Swift数组,再转成指针

以上是关于如何在 Swift 3 中将 [UInt8] 数组复制到 C 指针?的主要内容,如果未能解决你的问题,请参考以下文章

在Swift中将bytes / UInt8数组转换为Int

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

如何在 Swift 2.3 中将 UInt8 转换为 Anyobject

swift 在swift中将uint8转换为字符串

如何在 swift 3 中将具有自定义类的数组转换为 JSON

在 Swift 中浮动的 Uint8 数组 [重复]