2016-06-16 48 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。也许它已经这样做了。

相关问题