swift - 如何将 String 转换为 UnsafeMutablePointer<UInt8> ? swift 3

标签 swift xcode

我试过了

 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/

相关文章:

ios - swift 中的警报错误

ios - 如何在图形设计器中设计 SKNode 并在代码中重用它?

ios - swift 协议(protocol),IBOutlet 属性不能有非对象类型

iphone - UIPageViewController 导航方向适用于 iOS 5,但不适用于 6

objective-c - 未找到方法定义...使用 Xcode 自动 stub ?

ios - 如何在ipad上以单应用模式打开设置

swift - Xcode6-Beta Swift Playground 停止解释任何项目中的命令

iphone - 将图像添加到邮件时出错 - MFMailComposeViewController

c++ - 获取 Mac .app 包中的相对路径

ios - UITableViewController 的静态内容消失了