You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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^指数。

分步转换步骤:

  1. 提取目标字节:从数组中取出收缩压对应的两个字节——低字节246(数组索引1)、高字节244(数组索引2)。
  2. 组合成16位无符号整数:按小端序组合,计算方式为(高字节 << 8) | 低字节,即(244 << 8) | 246 = 62614,对应十六进制0xF4F6。
  3. 拆分指数和尾数:
    • 指数:取16位整数的高4位,(62614 >> 12) & 0xF = 15,4位补码的15转换为有符号数是-1(4位补码范围是-8到7,大于7的数减16得到负数)。
    • 尾数:取16位整数的低12位,62614 & 0xFFF = 1270(十六进制0x4F6),正数直接保留。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:10:53