Swift - 将数据转换为十进制值
Swift - converting data to decimal values
我正在通过 BLE 获取数据,我想将它们转换成十进制值,但是我怀疑我做错了什么,因为值范围似乎不正确
从 BLE 我收到 characteristic.value
24ffa400 6d08fcff fffffbff 0d001500 5eff
主要由 IMU 值构成。
当我尝试转换前两个字节时,在本例中 24ff
是加速度计 X 轴值,我得到一个范围为 1000-30000 的值(我向传感器引入了一些动态运动以查看价值如何变化)。
这一定是错误的,因为文档说加速度计刻度是 ±16G
还有两个比较重要的信息:
sequence of bytes in frame goes as follows: [LSB, MSB]
values are 16bit and utilizes two's complement
这是我将数据转换为十进制值的方法:
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
.
我正在通过 BLE 获取数据,我想将它们转换成十进制值,但是我怀疑我做错了什么,因为值范围似乎不正确
从 BLE 我收到 characteristic.value
24ffa400 6d08fcff fffffbff 0d001500 5eff
主要由 IMU 值构成。
当我尝试转换前两个字节时,在本例中 24ff
是加速度计 X 轴值,我得到一个范围为 1000-30000 的值(我向传感器引入了一些动态运动以查看价值如何变化)。
这一定是错误的,因为文档说加速度计刻度是 ±16G
还有两个比较重要的信息:
sequence of bytes in frame goes as follows: [LSB, MSB]
values are 16bit and utilizes two's complement
这是我将数据转换为十进制值的方法:
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
.