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)")
以上です、お疲れ様でした!