IEEE-11073 16位sfloat格式BLE血压数据转换技术咨询
Flutter集成血压设备:sfloat格式数据解析问题解答
问题1:接收的数组是什么格式?
你收到的[222, 246, 244, ...]是十进制表示的单个字节值。BLE设备传输的是字节流,日志里把每个0-255范围的无符号字节转换成了十进制数展示,比如246对应十六进制0xF6,244对应0xF4。
问题2:需要做什么转换?
需要把这两个十进制字节值先组合成sfloat格式的16位数据,再解析为十进制的血压值。这两个数只是字节的十进制表示,本身不是sfloat格式,必须经过组合和解析才能得到目标数值。
问题3:分步转换得到127.0的方法(附代码)
BLE血压测量特征(UUID00002a35-0000-1000-8000-00805f9b34fb)遵循IEEE 11073-20601标准,使用小端字节序,sfloat是16位结构:高4位为指数(补码有符号),低12位为尾数(补码有符号),计算公式为值 = 尾数 × 10^指数。
分步转换步骤:
- 提取目标字节:从数组中取出收缩压对应的两个字节——低字节246(数组索引1)、高字节244(数组索引2)。
- 组合成16位无符号整数:按小端序组合,计算方式为
(高字节 << 8) | 低字节,即(244 << 8) | 246 = 62614,对应十六进制0xF4F6。 - 拆分指数和尾数:
- 指数:取16位整数的高4位,
(62614 >> 12) & 0xF = 15,4位补码的15转换为有符号数是-1(4位补码范围是-8到7,大于7的数减16得到负数)。 - 尾数:取16位整数的低12位,
62614 & 0xFFF = 1270(十六进制0x4F6),正数直接保留。
- 指数:取16位整数的高4位,
- 计算最终血压值:代入公式
1270 × 10^(-1) = 127.0。
Dart/Flutter代码实现:
import 'dart:math'; double parseSfloat(int highByte, int lowByte) { // 小端序组合为16位无符号整数 final uint16 = (highByte << 8) | lowByte; // 解析指数(4位补码转有符号) final exponentRaw = (uint16 >> 12) & 0xF; final exponent = exponentRaw > 7 ? exponentRaw - 16 : exponentRaw; // 解析尾数(12位补码转有符号) final mantissaRaw = uint16 & 0xFFF; final mantissa = mantissaRaw > 2047 ? mantissaRaw - 4096 : mantissaRaw; // 计算最终浮点值 return mantissa * pow(10, exponent); } // 使用示例 void main() { // 收缩压对应的低字节246,高字节244 final systolic = parseSfloat(244, 246); print(systolic); // 输出:127.0 }
内容的提问来源于stack exchange,提问作者user23651217
相关产品推荐
相关产品推荐

