2016-10-26 9 views
0

私は数日前からBLEサービス特性値のデータにアクセスしようとしています。私はTemperature Sensorの例をSwiftに翻訳する方法を理解することが役に立ちましたと思っていましたが、私は同じ場所で立ち往生しています。Swift 3のデータからInt16を抽出する方法

- (CGFloat) maximumTemperature 
{ 
    CGFloat result = NAN; 
    int16_t value = 0; 

    if (maxTemperatureCharacteristic) { 
     [[maxTemperatureCharacteristic value] getBytes:&value length:sizeof (value)]; 
     result = (CGFloat)value/10.0f; 
    } 
    return result; 
} 

スウィフト3:

は、どのように私はOBJの-Cを翻訳していますか?代わりCGFloatの

は、私のコードで私は構造体を使用しています:

struct MPUData { 
    let x: Int16 
    let y: Int16 
    let z: Int16 
} 

及び第6は、x、y及びz成分(すなわち、あると特性から8バイトの値を受信して​​い最後のバイトが未使用であるx = 0x0Dy = 0x0Ez = 0x0F0x0D0E0F00

私はどのようにビットを横断し、そのInt16型の値として保存には考えています。どんな助けでも大歓迎です。

答えて

2

withUnsafeBytesを使用してみてください:

//Assuming `data` as `someCharacteristic.value!` 
//Create 4 Int16 data in little endian 
let data = Data(bytes: [0x0D, 0, 0x0E, 0, 0x0F, 0, 0, 0]) 

struct MPUData { 
    let x: Int16 
    let y: Int16 
    let z: Int16 
} 
let mpuData = data.withUnsafeBytes {(int16Ptr: UnsafePointer<Int16>)->MPUData in 
    MPUData(x: Int16(littleEndian: int16Ptr[0]), 
     y: Int16(littleEndian: int16Ptr[1]), 
     z: Int16(littleEndian: int16Ptr[2])) 
} 
print(mpuData.x,mpuData.y,mpuData.z) //->13 14 15 
+1

私は追加したい唯一のことは、私は初期化(データ:データ)でそれを固執するだろうということです?コンストラクタとあなたが予想されません場合はnilを返しますこれは通常あなたが間違ったデータを持っているので、バッファサイズです:guard data.count == MemoryLayout .size * 3 else {return nil} –

+0

これはうまくいくようです。うまくいけば今日私はテスト/投票するチャンスを得るでしょう。 – jjatie

関連する問題