2016-06-16 20 views
0

私はlibxml2とswiftでインターフェイスしており、C APIバインディング(まだ)はC文字列に対してUnsafePointer<Int8>!を生成します。スウィフトAPIは通常、UnsafePointer<UInt8>!になります。Swift3:文字列をヌル終端のC文字列に変換する適切な方法

私の質問は - 正しい方法でヌル終端のC文字列に文字列をしていますか?

let cfilePath = unsafeBitCast(myStringString.nulTerminatedUTF8.withUnsafeBufferPointer { $0.baseAddress }, to: UnsafePointer<Int8>.self) 

は私の代わりにだけでなくInt8バイトとしてUInt8バイトを解釈しスウィフト型チェックをバイパスする他のいくつかの方法を使用して好むべきでしょうか?

答えて

1

unsafeBitCastを使用しないでください!

let cstr = "alpha".nulTerminatedUTF8 
let int8arr = cstr.map{ Int8(bitPattern: $0) } 
let uint8arr = Array(cstr) 
print(int8arr.dynamicType, uint8arr.dynamicType) 
// Array<Int8> Array<UInt8> 

私は、これはまさに私は、これはトリックでしたBluetooth経由で文字列を送信していたプロジェクトのためにあなたの問題を解決するかわからない更新

let uint8: UInt8 = 200 
let int8 = Int8(bitPattern: uint8) 
print(uint8, int8) 
// 200 -56 
+0

これは私が推測する良い方法ではありません。 UIntは範囲0〜255の間にInt8(bitPattern:$ 0)は127を超える数のランタイム例外を生成します。 – ambientlight

+0

@ambientlight更新を参照してください.... – user3441734

+0

私は正しく、init(bitPattern:)は生成しません例外、私はInt8(_ value :)と混同しました... – ambientlight

1

extension String { 
    var nullTerminated: Data? { 
     if var data = self.data(using: String.Encoding.utf8) { 
      data.append(0) 
      return data 
     } 
     return nil 
    } 
} 

使用などをこの

let data = "asfasf".nullTerminated 

他の回答が参照している関数、nulTerminatedUTF8が見つかりません。たぶんそれはすでにこれをしています。

関連する問題