我知道有很多关于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()
构造似乎是错误的。
答案 0 :(得分:58)
很简单:
let input = "Hello World"
let data = input.data(using: .utf8)!
如果您想使用null终止data
,只需append
一个0即可。或者您可以致电cString(using:)
let cString = input.cString(using: .utf8)! // null-terminated
答案 1 :(得分:2)
NSString
框架中的 NSFoundation
方法,以支持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]
String null termination是C语言的一个实现细节,它不应泄漏到外面。如果您计划使用C API,请查看utf8CString
类型的String
属性:
public var utf8CString: ContiguousArray<CChar> { get }
Data
转换为CChar
后即可获得 UInt8
:
let input = "Hello World"
let data = Data(input.utf8CString.map { UInt8($0) })
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0]