问题描述
从 Gatt 特征读取后,我在从结果(部分)中获取正确的浮点值时遇到问题。 测量结果是一个4字节值(result1-4),表示为single-precision0 浮点数(IEEE 754-2008)
这是我的功能:
private fun getMeasurementData(data: ByteArray?,results: Int?) {
mDebugInfo!!.append("Read Measurements!\n")
if (data != null && results != null && results > 0) {
var r = results
var i = 1
while (r > 0) {
var resultId1 = data[i]
var resultId2 = data[i + 1]
var measureType = data[i + 2]
var measureStatus = data[i + 3]
var datetime1 = data[i + 4]
var datetime2 = data[i + 5]
var datetime3 = data[i + 6]
var datetime4 = data[i + 7]
var result1 = data[i + 8]
var result2 = data[i + 9]
var result3 = data[i + 10]
var result4 = data[i + 11]
val bytes = byteArrayOf(result1,result2,result3,result4)
val buffer = ByteBuffer.wrap(bytes,4).order(ByteOrder.LITTLE_ENDIAN)
val float = buffer.getFloat()
mDebugInfo!!.append(resultId1.toString() + " | " + resultId2.toString() + " | " + measureType.toString() + " | " + measureStatus.toString() + " | " + datetime1.toString() + " | " + datetime2.toString() + " | " + datetime3.toString() + " | " + datetime4.toString() + " | " + result1.toString() + " | " + result2.toString() + " | " + result3.toString() + " | " + result4.toString() + float +"\n")
i = i + 16
r--
}
}
}
结果 1-4 & val float 的 Byte.toString 的输出 (mDebugInfo) 是:
result1 | result2 | result3 | result4 | 从 ByteBuffer 浮动 |
---|---|---|---|---|
96 | -14 | -13 | -14 | 647.5922785 |
测量的正确值是 7.59 - 此值“包含”在浮点结果中:647.59 22785
我如何只获得这个值?
解决方法
此解决方案对我有用:
var resultBytes = byteArrayOf(result4,result3,result2,result1)
private fun getMeasurementValue(ba: ByteArray): String {
var resultHex = ba.toHexString()
var iRes = resultHex.toLong(16)
var fRes = java.lang.Float.intBitsToFloat(iRes.toInt()) // This is the FLOAT Value (fRes)
return String.format("%.2f",fRes)
}