2017-03-03 61 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) 

}