我试过了
return areKeysConsistent(
certificate as! UnsafeMutablePointer<UInt8>,
certificate.lengthOfBytes(using: <#T##String.Encoding#>.utf8),
privateKey as! UnsafeMutablePointer<UInt8>,
privateKey.lengthOfBytes(using: <#T##String.Encoding#>.utf8),
password as! UnsafeMutablePointer<UInt8>
)
但是IDE说 -“字符串总是失败。
转换它的正确方法是什么?谢谢
最佳答案
这是您必须使用 C 语言而遇到一些复杂情况的地方。
这里主要关注的是您传递给该函数的指针的生命周期。我下面的代码使用指向 Swift 字符串缓冲区的指针。如果 areKeysConsistent
捕获这些指针供以后使用,这将是一个问题。 ARC 有可能取消分配 Swift 字符串,使那些存储的指针变成悬空指针。
func areKeysConsistent(
_ cert: UnsafeMutablePointer<UInt8>, _ certLength: Int,
_ key: UnsafeMutablePointer<UInt8>, _ keyLength: Int,
_ pass: UnsafeMutablePointer<UInt8>, _ passLength: Int
) {
print(cert, key, pass)
}
let certificate = "cert"
let privateKey = "key"
let password = "password"
var certificateCString = certificate.utf8CString
var privateKeyCString = privateKey.utf8CString
var passwordCString = password.utf8CString
certificateCString.withUnsafeMutableBytes { certUMRBP in
privateKeyCString.withUnsafeMutableBytes { pkUMRBP in
passwordCString.withUnsafeMutableBytes { passUMRBP in
areKeysConsistent(
certUMRBP.baseAddress!.bindMemory(to: UInt8.self, capacity: certUMRBP.count),
certUMRBP.count,
pkUMRBP.baseAddress!.bindMemory(to: UInt8.self, capacity: pkUMRBP.count),
pkUMRBP.count,
passUMRBP.baseAddress!.bindMemory(to: UInt8.self, capacity: passUMRBP.count),
passUMRBP.count
)
}
}
}
关于swift - 如何将 String 转换为 UnsafeMutablePointer<UInt8> ? swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42584247/