iOS:将 UnsafeMutablePointer<Int8> 快速转换为字符串?

Posted

技术标签:

【中文标题】iOS:将 UnsafeMutablePointer<Int8> 快速转换为字符串?【英文标题】:iOS: Convert UnsafeMutablePointer<Int8> to String in swift? 【发布时间】:2015-11-28 18:12:24 【问题描述】:

正如标题所说,在swift中将UnsafeMutablePointer转换为String的正确方法是什么?

//lets say x = UnsafeMutablePointer<Int8> 

var str = x.memory.????

我尝试使用 x.memory.description 显然是错误的,给我一个错误的字符串值。

【问题讨论】:

指针指向什么? UTF-8 字节? NUL 终止? 假设它是一个有效的以null结尾的C字符串,你可以使用String(CString:, encoding:) 【参考方案1】:

如果指针指向一个以 NUL 结尾的 UTF-8 字节 C 字符串,你可以这样做:

import Foundation

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

let str = String(cString: x)

【讨论】:

让 str = String.fromCString(x)【参考方案2】:

时代变了。在 Swift 3+ 中,你会这样做:

如果您希望验证 utf-8:

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

如果要将 utf-8 错误转换为 unicode 错误符号:�

let str: String = String(cString: c_str)

假设c_str 的类型为UnsafePointer&lt;UInt8&gt;UnsafePointer&lt;CChar&gt;,它们的类型相同,并且大多数C 函数都返回。

【讨论】:

【参考方案3】:

这个:

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

似乎不适用于 UnsafeMutablePointer (这似乎在我的数据中)。

这是我在简单地弄清楚如何做类似 C/Perl 系统函数的事情:

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!)

如果我切换到验证UTF8(可选)而不是cString,我得到这个错误:

./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)
                                    ^~~~~~~~~~~~~

关于如何在管道输出上验证 UTF8 的想法(所以我在任何地方都没有得到 unicode 错误符号)?

(是的,我没有正确检查 print() 的可选选项,这不是我目前正在解决的问题 ;-))。

【讨论】:

以上是关于iOS:将 UnsafeMutablePointer<Int8> 快速转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

将应用程序从 iOS 6 转换为 iOS 7 [关闭]

将 io.BytesIO 转换为 io.StringIO 以解析 HTML 页面

如何将 io.Reader 变成 io.ReadCloser? [复制]

iOS 8:为啥 NSLayoutAttributeCenterX 无法将我的视图居中? (适用于 iOS 7)

ios - 将 facebook 与 ios5 应用程序集成

socket.io |我应该将路由处理程序包装在 io.on('connection') 中吗?