当前位置: 首页 > 面试题库 >

Swift 3:转换以空值结尾的UnsafePointer 到一个字符串

裴理
2023-03-14
问题内容

我有一个ac api返回一个以null终止的字符串,该字符串是类型数组unsigned char*(将对应于UnsafePointer<UInt8>)。

Swift具有初始值设定项String(validatingUTF8:),但参数必须为UnsafePointer<CChar>(aka
UnsafePointer<Int8>),并且在两者之间没有简单的转换方法。

如何从以null终止的c字符串转换为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")
}

也适用于有符号和无符号字符的序列(以空终止)。



 类似资料:
  • 问题内容: 当我使用的方法时 我不知道如何转换 为和长度 如何迅速做到这一点? 问题答案: 您必须先将字符串转换为UTF-8数据 然后将其写入输出流 该转换是必要的,因为有型,而不是如预期的 方法。 Swift 3更新:

  • 问题内容: 我发现以下代码可以编译并运行: 这将打印出来,并且是UTF8的有效表示形式 据我所知,这是未记录的行为。从文档中: 当一个函数被声明为带有UnsafePointer参数时,它可以接受以下任何一项: nil,作为空指针传递 * UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要时将其转换为Uns

  • 当读取文件时,将关键字flagstop、wb、nb、sb、eb从名称的开头移动到停止名称的结尾,例如“wb HASTINGS ST FS HOLDOM AVE”变为“HASTINGS ST FS HOLDOM AVE wb”。 到目前为止,我已经获得了如下所示的读取文件的代码,但我不确定如何将数组中的字符串关键字移动到字符串的结尾,给出了上面所示的条件。我需要能够移动第一个字在停止[2]如果它是上

  • 问题内容: 我需要阅读以传输一堆数据。 由于并非所有s的长度都恰好是100个字符,因此剩余的部分将用s 填充。 如果我将by 转换为:,则尾部s将显示为s。 在C中,will终止于,所以我想知道将其转换为Golang 的最佳方法是什么。 问题答案: 将数据读取到字节片中的方法返回读取的字节数。您应该保存该数字,然后使用它创建字符串。如果是读取的字节数,则代码将如下所示: 要转换完整的字符串,可以使

  • 问题内容: 这个: 这样做(是空字节): 问题答案: Go的syscall程序包中隐藏了该函数,该函数查找第一个空字节([] byte {0})并返回长度。我假设它被称为C-Length。 抱歉,我迟到了一年,但是我认为它比其他两个 要 简单得多(没有不必要的输入等)。 所以, ^的意思是设置为从头到索引处的字节片。 结果将为3。

  • 问题内容: 在需要var以换行符结尾的情况下,处理套接字连接的最佳方法是什么?我正在使用下面的代码,但有时数据包会 分块 ,并且需要很长时间才能匹配。我还尝试了其他方法,例如保存最后一行(如果结尾不行)并将其附加到下一个循环中。但这也行不通,因为多个数据包被分块并且第一和第二部分不匹配。我无法控制另一端,它基本上会发送多行以结尾的行。 任何建议都将受到欢迎,因为我对套接字连接了解不多。 “ 正常