将NSData复制到UnsafeMutablePointer <void>

时间:2016-05-26 20:27:46

标签: c swift swift2 unsafe-pointers secure-transport

你好stackoverflowers。我正在实现一个安全传输的包装器,我被困在一些C - &gt; Swift语法。

func sslReadCallback(connection: SSLConnectionRef,
    data: UnsafeMutablePointer<Void>,
    var dataLength: UnsafeMutablePointer<Int>) -> OSStatus
{
    //let bytesRequested = dataLength.memory
    let transportWrapper:SecureTransportWrapper = UnsafePointer(connection).memory
    let bytesRead:NSData = transportWrapper.readFromConnectionFunc(transportWrapper.connection)

    dataLength = UnsafeMutablePointer<Int>.alloc(1)
    dataLength.initialize(bytesRead.length)

    if (bytesRead.length == 0)
    {
        return OSStatus(errSSLClosedGraceful)
    }
    else
    {
        data.alloc(sizeof(bytesRead.length)) //<----compile error here
        return noErr
    }
}

我已经标记了编译错误的位置。我不会因为犯错而责备它,我在这里猜测:P。我正在尝试将NSData复制到数据:UnsafeMutablePointer。我该怎么做?

编译错误:

  

/ Users / * / SecureTransportWrapper.swift:108:9:静态成员'alloc'不能用于'UnsafeMutablePointer'类型的实例(又名'UnsafeMutablePointer&lt;()&gt;')

非常感谢!

=====

更新:这是sslReadCallback应该做的api文档:

  

连接:连接参考。

     

数据:返回时,您的回调应覆盖此位置的内存,并从连接中读取数据。

     

dataLength:输入时,指向整数的指针   表示以字节为单位的数据长度。返回时,回调   应该用实际的字节数覆盖该整数   传送。

摘自here

1 个答案:

答案 0 :(得分:0)

好的,让我们看看你的代码:

dataLength = UnsafeMutablePointer<Int>.alloc(1)
dataLength.initialize(bytesRead.length)

dataLength是一个传入的指针,它是函数调用者给你的缓冲区大小希望你输入你读取的字节数的地方。你不需要分配它,它已经被分配了。

(与此示例不相关但是:同样在alloc(N)和initialize(N)中,N应该是相同的(它是分配的内存量,然后进行初始化))

我认为你想要的是什么(Swift 3使用pointee代替memory)是这样的:

dataLength.memory = bytesRead.length

C API表示您还可以从此变量中获取data缓冲区的大小。 data将按此大小预先分配。

确保您阅读的数据符合(bytesRead.length <= dataLength.memory),然后执行

memcpy(data, bytesRead.bytes, bytesRead.length)

就是这样。