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

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

概述我有一个c api返回一个以null结尾字符串,该字符串是unsigned char *类型的数组(对应于UnsafePointer< UInt8>). Swift有初始值字符串String(validatingUTF8 :),但参数必须是UnsafePointer< CChar> (a.k.a. UnsafePointer< Int8>),并没有简单的方法在两者之间进行转换. 如何从这个以nu 我有一个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结尾的)序列.

总结

以上是内存溢出为你收集整理的Swift 3:将以null结尾的UnsafePointer转换为字符串全部内容,希望文章能够帮你解决Swift 3:将以null结尾的UnsafePointer转换为字符串所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1010458.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存