0

こんにちは、スタックオーバーフラワーです。私はセキュア トランスポートのラッパーを実装していますが、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 を data:UnsafeMutablePointer にコピーしようとしています。それ、どうやったら出来るの?

コンパイル エラー:

/Users/*/SecureTransportWrapper.swift:108:9: 静的メンバー 'alloc' はタイプ 'UnsafeMutablePointer' (別名 'UnsafeMutablePointer<()>') のインスタンスでは使用できません

ありがとうございます!

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

更新: sslReadCallback が行うべきことの API ドキュメントは次のとおりです。

connection: 接続参照。

data: 戻ったときに、コールバックは、接続から読み取ったデータでこの場所のメモリを上書きする必要があります。

dataLength: 入力では、データの長さをバイト単位で表す整数へのポインター。戻り時に、コールバックは実際に転送されたバイト数でその整数を上書きする必要があります。

ここから抜粋

4

1 に答える 1

1

OK、あなたのコードを見てみましょう:

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

dataLength渡されるポインターです。関数の呼び出し元がバッファーのサイズを提供し、読み取ったバイト数を入力する必要がある場所です。これを割り当てる必要はありません。すでに割り当てられています。

(この例には関係ありませんが、alloc(N) と initialize(N) でも N は同じでなければなりません (これは、割り当てられてから初期化されるメモリの量です))

私はあなたが望むものだと思います(Swift 3はpointee代わりに使用しますmemory)これは次のとおりです:

dataLength.memory = bytesRead.length

dataC API は、この変数からバッファーのサイズも取得すると述べています。dataこのサイズに事前に割り当てられます。

読み取ったデータが ( bytesRead.length <= dataLength.memory) に適合することを確認してから、

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

それで全部です。

于 2016-05-26T20:45:02.790 に答える