2016-06-16 54 views
0

我在swift中與libxml2進行交互,並且C API綁定(仍然)爲c字符串生成UnsafePointer<Int8>!。 Swift API通常會導致UnsafePointer<UInt8>!Swift3:將字符串轉換爲以空字符結尾的C字符串的正確方法

所以我的問題是 - 我正在以正確的方式做字符串以空終止的C字符串?

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

如果我反而更喜歡使用其他一些方法,而不是僅僅繞過雨燕與解釋UInt8字節Int8字節檢查?

回答

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> 

更新

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

這不是我猜的好方法。 Int8(bitPattern:$ 0)將產生127以上的數字的運行時異常,而UInt的範圍爲0 ... 255 – ambientlight

+0

@ambientlight請參閱更新.... – user3441734

+0

請原諒,你是對的,init(bitPattern:)不會產生例外,我把它與Int8(_值:)混淆...... – 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。也許它已經這樣做了。

相關問題