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序列上失败而不是替换它们 以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结尾的)序列. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |