2016-11-29 66 views
1

我试图将Swift [UInt8]缓冲区复制到C指针。我无法找到合适的解决方案,这是我的代码:如何将[UInt8]数组复制到Swift 3中的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不兼容。

帮助赞赏。

+0

你不应该在Swift中使用memcpy。这是不安全和笨拙的地狱。相反,你应该使用'NSData'而不是'[UInt8]'来建模一个字节流。它内置了用于复制的初始化程序。如果您展示更多关于如何获得这些字节以及您想要如何处理这些字节的上下文,我可以为您提供帮助。 – Alexander

+0

我只是想向现有的cURL Swift库添加一些功能。他们不使用数据(NSData)出于某种原因,但[UInt8]缓冲区(甚至不包括基础库)。我认为我应该按照已经写好的方式。不知道为什么memcpy应该如此笨重? –

+0

因为它使你使用不安全的原始指针 – Alexander

回答

2

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

+0

rawData.baseAddress似乎在做诡计:) –

+0

请参阅我的编辑。在Swift中真的没有理由使用memcpy:p – Alexander

+0

但是我在C回调函数中获取'a'作为指针。让readFunc:curl_func = {(a,size,num,p) - > Int in ...不确定a = rawData是否可以工作? –