0

你好,stackoverflowers。我正在为安全传输实现一个包装器,但我坚持使用一些 C -> 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<()>”)

万分感谢!

=================

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

连接:连接参考。

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

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

从这里摘录

4

1 回答 1

1

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

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)

就这样。

于 2016-05-26T20:45:02.790 回答