Swift 3 从字符串创建 utf8 编码数据的方法
Swift 3 method to create utf8 encoded Data from String
我知道有很多关于 NSData 的 Swift3 之前的问题。我很好奇如何在 Swift3 String
和 utf8 编码(有或没有空终止)到 Swift3 Data
对象之间切换。
到目前为止我想到的最好的是:
let input = "Hello World"
let terminatedData = Data(bytes: Array(input.nulTerminatedUTF8))
let unterminatedData = Data(bytes: Array(input.utf8))
必须进行中间 Array()
构造似乎是错误的。
很简单:
let input = "Hello World"
let data = input.data(using: .utf8)!
如果你想用 null 终止 data
,只需 append
一个 0 就可以了。或者您可以致电 cString(using:)
let cString = input.cString(using: .utf8)! // null-terminated
来自 NSFoundation
框架的 NSString
方法应该被放弃,以支持 Swift 标准库等价物。数据可以用任何 Sequence
元素初始化,其中元素是 UInt8
。 String.UTF8View
满足这个要求。
let input = "Hello World"
let data = Data(input.utf8)
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
字符串空终止是C语言的实现细节,不应该外泄。如果您打算使用 C API,请查看 String
类型的 utf8CString
属性:
public var utf8CString: ContiguousArray<CChar> { get }
Data
可由CChar
转换为UInt8
得到:
let input = "Hello World"
let data = Data(input.utf8CString.map { UInt8([=12=]) })
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0]
我知道有很多关于 NSData 的 Swift3 之前的问题。我很好奇如何在 Swift3 String
和 utf8 编码(有或没有空终止)到 Swift3 Data
对象之间切换。
到目前为止我想到的最好的是:
let input = "Hello World"
let terminatedData = Data(bytes: Array(input.nulTerminatedUTF8))
let unterminatedData = Data(bytes: Array(input.utf8))
必须进行中间 Array()
构造似乎是错误的。
很简单:
let input = "Hello World"
let data = input.data(using: .utf8)!
如果你想用 null 终止 data
,只需 append
一个 0 就可以了。或者您可以致电 cString(using:)
let cString = input.cString(using: .utf8)! // null-terminated
NSFoundation
框架的 NSString
方法应该被放弃,以支持 Swift 标准库等价物。数据可以用任何 Sequence
元素初始化,其中元素是 UInt8
。 String.UTF8View
满足这个要求。
let input = "Hello World"
let data = Data(input.utf8)
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
字符串空终止是C语言的实现细节,不应该外泄。如果您打算使用 C API,请查看 String
类型的 utf8CString
属性:
public var utf8CString: ContiguousArray<CChar> { get }
Data
可由CChar
转换为UInt8
得到:
let input = "Hello World"
let data = Data(input.utf8CString.map { UInt8([=12=]) })
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0]