2016-07-02 4 views
0

質問があります。私はMiバンドとのインターフェースを試みています。 githubでこのコードが見つかりました。うまくいきます。しかし、私はデータ型変換で何が起こっているのか理解していません。このコードブロックから来MacのSwiftでBLEのデータ型変換

  var u16 = UnsafePointer<Int32>(characteristic.value!.bytes).memory 

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { 

    output("Data for "+characteristic.UUID.UUIDString, data: characteristic.value!) 

    if(characteristic.UUID.UUIDString == "FF06") { 
     spinnerView.hidden = true 
     let u16 = UnsafePointer<Int>(characteristic.value!.bytes).memory 
     stepsView.stringValue = ("\(u16) steps") 
    } else if(characteristic.UUID.UUIDString == "FF0C") { 
     spinnerView.hidden = true 
     var u16 = UnsafePointer<Int32>(characteristic.value!.bytes).memory 
     u16 = u16 & 0xff 
     batteryView.stringValue = ("\(u16) % charged") 
    } 


} 

誰かが私にそれを説明することはできますか?ありがとうございました!

+0

それは方法だ他の値にNSDataのを変換する(スウィフトの最後のバージョンにしたり、新しい方法、私は知らない)(私たちの場合、彼らは 'int'または'のInt32です')。以前は、 'getBytes:length:'であった。 – Larme

+0

@Larmeご返信ありがとうございます。その場合、なぜ「UnsafePointer」が使用されますか? – vevek

+0

http://stackoverflow.com/questions/26045762/how-does-nsdatabyteslength-convert-byte-to-unsafepointervoid-in-swift? – Larme

答えて

0

この部分は、メモリのアドレスを取得します

characteristic.value!.bytes 

しかし.bytesの戻り型はUnsafePointer<Void>ので、これはその後にCポインタにスウィフト等価であるUnsafePointer<Int32>型に変換されます32ビット整数(int32_t* ptr;)。スウィフトは

UnsafePointer<Int32>(characteristic.value!.bytes) 

あなたは(Cで、それは*ptrだろう).memoryを使用して、このようなポインタの内容を取得します。したがって、u16変数は、タイプInt32(そのメモリロケーションの内容は、Int32と解釈されます)の値です。

var u16 = UnsafePointer<Int32>(characteristic.value!.bytes).memory 

次の行は、次に電池パーセンテージとしてこれを印刷し、値のみ最下位8ビットを残して、すべての上位24ビットをマスク。

0

スウィフト3

if you have this kind of characteristic : 

<CBCharacteristic: 0x26e42b42, UUID = Battery, properties = 0x33, 
    value = <4d455348 54454348 204153>, notifying = NO> 


    then use this type code: 
    let value = [UInt8](characteristic.value!) 
関連する問題