Swift5でData型をInt型やDouble型などと相互変換する方法を紹介します。Core Bluetoothを使ってBLE通信をする際は、バイナリデータを使うことになるので、この方法を覚えておくと便利です。
Dataを〇〇に変換
UInt32に変換する場合
data.withUnsafeBytes { $0.load( as: UInt32.self ) }
Doubleに変換する場合
data.withUnsafeBytes { $0.load( as: Double.self ) }
このようにas:に型タイプを指定することで、Dataから各型に変換することができます。
〇〇からDataに変換
Dataに変換する時は、下記のコードでいけます。
data = Data(bytes: &value, count: MemoryLayout.size(ofValue: value))
BLEなどでバイナリデータを操作する場合
BLEでデータをやりとりする場合はバイナリデータ(Data型)で送受信します。そういった時は送受信するメッセージをクラスとしてまとめておくと操作が簡単になります。
例えば、id(UInt16)とvalue(Float)をセットで送受信する場合を想定して、idとvalueを持ったMessageクラスを用意しました。(わかりやすさ重視で異常系は省いています)
class Message { var id: UInt16 = 0 var value: Float = 0.0 init (id: UInt16, value: Float) { self.id = id self.value = value } init(data: Data) { id = Data(data[0...1]).withUnsafeBytes { $0.load( as: UInt16.self ) } value = Data(data[2...5]).withUnsafeBytes { $0.load( as: Float.self ) } } func toData() -> Data { var data = Data(bytes: &id, count: MemoryLayout.size(ofValue: id)) data.append(Data(bytes: &value, count: MemoryLayout.size(ofValue: value))) return data } }
これを使うとBLEの送信時には次のように書けます。
let sendMessage = Message(id: 1, value: 1.5) peripheral.writeValue(sendMessage.toData(), for: characteristis!, type: .withResponse)
受信時は次のように書けます。
let receivedMessage = Message(data: requests.first?.value) print("id= \(receivedMessage.id)") print("value= \(receivedMessage.value)")
以上です、お疲れ様でした!