加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift 3:将以null结尾的UnsafePointer转换为字符串

发布时间:2020-12-14 04:49:29 所属栏目:百科 来源:网络整理
导读:我有一个c api返回一个以null结尾的字符串,该字符串是unsigned char *类型的数组(对应于UnsafePointer UInt8). Swift有初始值字符串String(validatingUTF8 :),但参数必须是UnsafePointer CChar (a.k.a. UnsafePointer Int8),并没有简单的方法在两者之间进行
我有一个c api返回一个以null结尾的字符串,该字符串是unsigned char *类型的数组(对应于UnsafePointer< UInt8>).

Swift有初始值字符串String(validatingUTF8 :),但参数必须是UnsafePointer< CChar> (a.k.a. UnsafePointer< Int8>),并没有简单的方法在两者之间进行转换.

如何从这个以null结尾的c-string转换为Swift字符串?

解决方法

在Swift 3中,String有两个初始化器

public init(cString: UnsafePointer<CChar>)
public init(cString: UnsafePointer<UInt8>)

因此,它可以从有符号和无符号字符的(空终止)序列创建.所以

let s = String(cString: yourCharPointer)

应该工作.

String有另一个初始化器

public init?(validatingUTF8 cString: UnsafePointer<CChar>)

在错误的UTF-8序列上失败而不是替换它们
由替换字符组成.这个init方法没有对应的
取无符号字符.

以CString.swift中的现有实现为例,将其添加为扩展并不太难:

extension String {
    public init?(validatingUTF8 cString: UnsafePointer<UInt8>) {
        guard let (s,_) = String.decodeCString(cString,as: UTF8.self,repairingInvalidCodeUnits: false) else {
            return nil
        }
        self = s
    }
}

然后

if let s = String(validatingUTF8: yourCharPointer) {
    print(s)
} else {
    print("invalid UTF-8")
}

也适用于有符号和无符号字符的(以null结尾的)序列.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读