Swift 3: converting UnsafePointer with null termination of <UInt8> to string

I have a c api that returns a null-terminated string that is an array of type unsigned char*(which matches UnsafePointer<UInt8>).

Swift has an initializer String(validatingUTF8:), but the argument must be UnsafePointer<CChar>(aka UnsafePointer<Int8>), and there is no trivial way to convert between them.

How do I convert from this zero-terminated c-string to a Swift string?

+3
source share
1 answer

Swift 3 Stringhas two initializers

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")
}

( ) , .

+9

Source: https://habr.com/ru/post/1654970/


All Articles