web-dev-qa-db-ja.com

Swift 3文字列からutf8エンコードデータを作成する方法

NSDataに関しては、Swift3以前の質問がたくさんあります。 Swift3 StringからSwift3 Dataオブジェクトにエンコードされたutf8(null終端付きまたはなし)に移動する方法に興味があります。

これまでに思いついた最高のものは:

_let input = "Hello World"
let terminatedData = Data(bytes: Array(input.nulTerminatedUTF8))
let unterminatedData = Data(bytes: Array(input.utf8))
_

中間のArray()構築を行わなければならないのは間違っているようです。

24
Travis Griggs

それは簡単です:

_let input = "Hello World"
let data = input.data(using: .utf8)!
_

dataをnullで終了する場合は、単にappendに0を指定します。または、cString(using:)を呼び出すことができます

_let cString = input.cString(using: .utf8)! // null-terminated
_
59
Code Different

NSStringフレームワークからのNSFoundationメソッドは、Swift標準ライブラリに相当します。データは、UInt8であるSequenceで初期化できます。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は、CCharUInt8に変換された後に取得できます。

let input = "Hello World"
let data = Data(input.utf8CString.map { UInt8($0) })
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0]
3