0

我正在快速与 libxml2 交互,并且 C API 绑定(仍然)UnsafePointer<Int8>!为 c 字符串生成。而 Swift API 通常会导致UnsafePointer<UInt8>!.

所以我的问题是 - 我是否以正确的方式将字符串转换为以空字符结尾的 C 字符串?

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

我是否应该更喜欢使用其他方法,而不是绕过 Swift 类型检查,将UInt8字节解释为Int8字节?

4

2 回答 2

2

我不确定这是否能完全解决您的问题,但对于我通过蓝牙发送字符串的项目,这可以解决问题:

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

于 2017-08-08T17:59:16.973 回答
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
于 2016-06-16T05:41:43.943 回答