user3162662
user3162662

Reputation: 793

iOS: Convert UnsafeMutablePointer<Int8> to String in swift?

As the title says, what is the correct way to convert UnsafeMutablePointer to String in swift?

//lets say x = UnsafeMutablePointer<Int8> 

var str = x.memory.????

I tried using x.memory.description obviously it is wrong, giving me a wrong string value.

Upvotes: 23

Views: 22764

Answers (3)

johnkzin
johnkzin

Reputation: 31

this:

let str: String? = String(validatingUTF8: c_str)

doesn't appear to work with UnsafeMutablePointer<UInt8> (which is what appears to be in my data).

This is me trivially figuring out how to do something like the C/Perl system function:

let task = Process()
task.launchPath = "/bin/ls"
task.arguments = ["-lh"]

let pipe = Pipe()
task.standardOutput = pipe
task.launch()

let data = pipe.fileHandleForReading.readDataToEndOfFile()
var unsafePointer = UnsafeMutablePointer<Int8>.allocate(capacity: data.count)
data.copyBytes(to: unsafePointer, count: data.count)

let output : String = String(cString: unsafePointer)
print(output)
//let output : String? = String(validatingUTF8: unsafePointer)
//print(output!)

if I switch to validatingUTF8 (with optional) instead of cString, I get this error:

./ls.swift:19:37: error: cannot convert value of type 'UnsafeMutablePointer<UInt8>' to expected argument type 'UnsafePointer<CChar>' (aka 'UnsafePointer<Int8>')
let output : String? = String(validatingUTF8: unsafePointer)
                                    ^~~~~~~~~~~~~

Thoughts on how to validateUTF8 on the output of the pipe (so I don't get the unicode error symbol anywhere)?

(yes, I'm not doing proper checking of my optional for the print(), that's not the problem I'm currently solving ;-) ).

Upvotes: 2

rob mayoff
rob mayoff

Reputation: 385540

If the pointer points to a NUL-terminated C string of UTF-8 bytes, you can do this:

import Foundation

let x: UnsafeMutablePointer<Int8> = ...
// or UnsafePointer<Int8>
// or UnsafePointer<UInt8>
// or UnsafeMutablePointer<UInt8>

let str = String(cString: x)

Upvotes: 56

LimeRed
LimeRed

Reputation: 1306

Times have changed. In Swift 3+ you would do it like this:

If you want the utf-8 to be validated:

let str: String? = String(validatingUTF8: c_str)

If you want utf-8 errors to be converted to the unicode error symbol: �

let str: String = String(cString: c_str)

Assuming c_str is of type UnsafePointer<UInt8> or UnsafePointer<CChar> which is the same type and what most C functions return.

Upvotes: 10

Related Questions