[英]Swift - converting data to decimal values
我正在通過BLE獲取數據,並且想將它們轉換為十進制值,但是我懷疑我做錯了,因為值范圍似乎不正確
從BLE我收到characteristic.value
24ffa400 6d08fcff fffffbff 0d001500 5eff
它是由IMU值構成的。
當我嘗試轉換前兩個字節(在此示例中為24ff
,它是加速度計X軸值)時,得到的值在1000-30000范圍內(我向傳感器引入了一些動態運動以查看該值如何變化)。
這一定是錯誤的,因為文檔說加速度計的刻度為±16G
還有兩個更重要的信息:
幀中的字節序列如下:[LSB,MSB]
值是16位,並利用二進制補碼
這就是我將數據轉換為十進制值的方式:
class func getAccelerometerData(value: NSData) -> [String] {
let dataFromSensor = dataToSignedBytes8(value)
let bytes:[Int8] = [dataFromSensor[1], dataFromSensor[0]]
let u16 = UnsafePointer<Int16>(bytes).memory
return([twosComplement(u16)])
}
class func twosComplement(num:Int16) -> String {
var numm:UInt16 = 0
if num < 0 {
let a = Int(UInt16.max) + Int(num) + 1
numm = UInt16(a)
}
else { return String(num, radix:10) }
return String(numm, radix:10)
}
我想我應該從范圍<-16:16>中獲取值,而不是上面提到的巨大值,我的方法有什么問題?
提前致謝
編輯:缺少方法實現
class func dataToSignedBytes8(value : NSData) -> [Int8] {
let count = value.length
var array = [Int8](count: count, repeatedValue: 0)
value.getBytes(&array, length:count * sizeof(Int8))
return array
}
給定一些NSData
,
let value = NSData(bytes: [0x24, 0xff, 0xa4, 0x00] as [UInt8], length: 4)
print(value) // <24ffa400>
您可以按[LSB,MSB]順序將前兩個字節作為帶符號的16位整數檢索,
let i16 = Int16(littleEndian: UnsafePointer<Int16>(data.bytes).memory)
print(i16) // -220
此數字的范圍是-32768 .. 32767
並且必須根據設備的規格將其縮放到浮點范圍,例如:
let scaled = 16.0 * Double(i16)/32768.0
print(scaled) // -0.107421875
scaled
是Double
,可以使用String(scaled)
或使用NSNumberFormatter
轉換為字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.