【问题标题】:Swift3: Proper way to convert string to null-terminated C-stringSwift3:将字符串转换为以空字符结尾的 C 字符串的正确方法
【发布时间】:2016-06-16 05:27:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: swift swift3


    【解决方案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。也许它已经这样做了。

    【讨论】:

      【解决方案2】:

      不要为此使用 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
      

      【讨论】:

      • 我猜这不是一个好方法。 Int8(bitPattern: $0) 会对大于 127 的数字产生运行时异常,而 UInt 的范围是 0...255
      • 对不起,你是对的,init(bitPattern: ) 不会产生异常,我把它和 Int8(_ value:) 混淆了...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多