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

时间:2016-09-16 13:56:37

标签: swift string

我有一个c api,它返回一个以空字符结尾的字符串,该字符串是unsigned char*类型的数组(对应于UnsafePointer<UInt8>)。

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

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

1 个答案:

答案 0 :(得分:10)

在Swift 3中,String有两个初始值设定项

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

因此,它可以从有符号和无符号字符的(以null结尾的)序列创建。所以

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结尾的)序列。