Swift3:将字符串转换为以空字符结尾的 C 字符串的正确方法
Swift3: Proper way to convert string to null-terminated C-string
我在 swift 中与 libxml2 交互,C API 绑定(仍然)为 C 字符串生成 UnsafePointer<Int8>!
。而 Swift API 通常会导致 UnsafePointer<UInt8>!
.
所以我的问题是 - 我是否以正确的方式将字符串转换为空终止的 C 字符串?
let cfilePath = unsafeBitCast(myStringString.nulTerminatedUTF8.withUnsafeBufferPointer { [=10=].baseAddress }, to: UnsafePointer<Int8>.self)
我是否应该更喜欢使用其他方法,而不是仅仅通过将 UInt8
字节解释为 Int8
字节来绕过 Swift 类型检查?
不要为此使用 unsafeBitCast!!
let cstr = "alpha".nulTerminatedUTF8
let int8arr = cstr.map{ Int8(bitPattern: [=10=]) }
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
我不确定这是否能准确解决您的问题,但对于我通过蓝牙发送字符串的项目来说,这确实有效:
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。也许它已经这样做了。
我在 swift 中与 libxml2 交互,C API 绑定(仍然)为 C 字符串生成 UnsafePointer<Int8>!
。而 Swift API 通常会导致 UnsafePointer<UInt8>!
.
所以我的问题是 - 我是否以正确的方式将字符串转换为空终止的 C 字符串?
let cfilePath = unsafeBitCast(myStringString.nulTerminatedUTF8.withUnsafeBufferPointer { [=10=].baseAddress }, to: UnsafePointer<Int8>.self)
我是否应该更喜欢使用其他方法,而不是仅仅通过将 UInt8
字节解释为 Int8
字节来绕过 Swift 类型检查?
不要为此使用 unsafeBitCast!!
let cstr = "alpha".nulTerminatedUTF8
let int8arr = cstr.map{ Int8(bitPattern: [=10=]) }
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
我不确定这是否能准确解决您的问题,但对于我通过蓝牙发送字符串的项目来说,这确实有效:
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。也许它已经这样做了。