UInt8 数组 Swift 到 const char* C

Rei*_*ill 0 c swift swift3

我有以下功能

public func encryptWithRSAKey(_ data: String, rsaKeyRef: SecKey, padding: SecPadding) -> [UInt8]? {

    let blockSize = SecKeyGetBlockSize(rsaKeyRef)
    var messageEncrypted = [UInt8](repeating: 0, count: blockSize)
    var messageEncryptedSize = blockSize

    var status: OSStatus!

    status = SecKeyEncrypt(rsaKeyRef, SecPadding.OAEP, data, data.count, &messageEncrypted, &messageEncryptedSize)

    if status != noErr {
        print("\(logClassName): Encryption Error!")
    }

    return messageEncrypted

}
Run Code Online (Sandbox Code Playgroud)

输出为 encryptedMessage = [9,43,128...] 128 长度

我必须将结果发送到 C 函数中

void STDCALL CpProxyAvOpenhomeOrgCredentials1BeginSet(THandle aHandle, const char* aId, const char* aUserName, const char* aPassword, uint32_t aPasswordLen, OhNetCallbackAsync aCallback, void* aPtr)
{
    CpProxyAvOpenhomeOrgCredentials1C* proxyC = reinterpret_cast<CpProxyAvOpenhomeOrgCredentials1C*>(aHandle);
    ASSERT(proxyC != NULL);
    Brh buf_aId(aId);
    Brh buf_aUserName(aUserName);
    Brh buf_aPassword;
    buf_aPassword.Set((const TByte*)aPassword, aPasswordLen);
    FunctorAsync functor = MakeFunctorAsync(aPtr, (OhNetFunctorAsync)aCallback);
    proxyC->BeginSet(buf_aId, buf_aUserName, buf_aPassword, functor);
}
Run Code Online (Sandbox Code Playgroud)

将 messageEncrypted 快速编码为 C 中的 const char* aPassword 的方法是什么

Mar*_*n R 5

交流功能

void cfunc(const char* aPassword, uint32_t aPasswordLen);
Run Code Online (Sandbox Code Playgroud)

导入到 Swift 中

public func cfunc(_ aPassword: UnsafePointer<Int8>!, _ aPasswordLen: UInt32)
Run Code Online (Sandbox Code Playgroud)

对于数组,withUnsafeBufferPointer()为您提供指向(连续)元素存储的指针。由于不同的符号(Int8 vs UInt8),指针必须“反弹”。例子:

let encryptedMessage: [UInt8] = [9, 43, 128]

encryptedMessage.withUnsafeBufferPointer {
    $0.baseAddress!.withMemoryRebound(to: Int8.self, capacity: encryptedMessage.count) {
        cfunc($0, UInt32(encryptedMessage.count))
    }
}
Run Code Online (Sandbox Code Playgroud)