2017-03-03 25 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をUnsafeMutablePointerに変換する可能性のある複写]の可能な複製(http://stackoverflow.com/questions/30042494/swift-convert-string-to- unsafemutablepointerint8) – JAL

答えて

1

あなたが実行する場所です。 Cで作業する必要があり、ある程度の複雑さがあります。

ここでの主な関心事は、その関数に渡すポインタの寿命です。以下のコードでは、Swift Stringsのバッファへのポインタを使用しています。後で使用するためにareKeysConsistentがそれらのポインタをキャプチャする場合は問題になります。 ARCがSwift Stringを割り当て解除し、格納されているポインタがぶら下がりポインタになる可能性があります。

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) 

} 
関連する問題