2017-03-03 60 views
0

我已经试过这如何将字符串转换为UnsafeMutablePointer <UInt8>?斯威夫特3

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说 - “字符串总是失败

什么是转换它的正确方法?谢谢

+1

的问题是,一个字符串是INT8(CCHAR),_not_ UIInt8的数组。这里有一个类型不匹配。它是由UInt8构成的_data_(Data,NSData)。 – matt

+0

“areKeysConsistent”函数来自哪里?它受你控制吗?奇怪的是,它预计'UInt8'不'CChar'('Int8') – Alexander

+1

可能重复的[Swift convert string to UnsafeMutablePointer ](http://stackoverflow.com/questions/30042494/swift-convert-string-to- unsafemutablepointerint8) – JAL

回答

1

这是你运行从一定的复杂性,因为必须与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 
    ) 
} 
} 
} 
+0

谢谢,答案是 –

+0

@ElizabethHernandez你是否检查过'areKeysConsistent'不让指针逃脱? – Alexander

0

感谢@Alexander这里解决我的问题是我的代码:

func areKeysConsistentSwift(_ certificate : String, 
          privateKey : String, 
          password : String) -> Int32 { 

    var result: Int32 = 0 
    var certificateCString = certificate.utf8CString 
    var privateKeyCString = privateKey.utf8CString 
    var passwordCString = password.utf8CString 


    certificateCString.withUnsafeMutableBytes { certUMRBP in 
     privateKeyCString.withUnsafeMutableBytes { pkUMRBP in 
      passwordCString.withUnsafeMutableBytes { passUMRBP in 

       result = areKeysConsistent(
        certUMRBP.baseAddress!.bindMemory(to: UInt8.self, capacity: certUMRBP.count), 
        UInt32(certUMRBP.count), 
        pkUMRBP.baseAddress!.bindMemory(to: UInt8.self, capacity: pkUMRBP.count), 
        UInt32(pkUMRBP.count), 
        passUMRBP.baseAddress!.bindMemory(to: Int8.self, capacity: passUMRBP.count) 

       ) 
       print ("-------1--------") 
       print (certUMRBP) 
       print ("---------------") 

       print ("-------2--------") 
       print (pkUMRBP) 
       print ("---------------") 

       print ("-------3--------") 
       print (passUMRBP) 
       print ("---------------") 

      } 
     } 
    } 
    return Int32(result) 

}