文章目录
正文
根据IEEE 11073 SFLOAT标准,心率血氧数据通常包含在特定的数据结构中。对于字节数组 [0, 0, 240, 0, 240],这里是一个C#转换代码:

csharp
using System;
public class HeartRateOxygenData
{
public static (float? HeartRate, float? OxygenSaturation) ParseData(byte[] data)
{
if (data == null || data.Length < 5)
return (null, null);
float? heartRate = null;
float? oxygenSaturation = null;
// 通常前2个字节包含标志位,后面是测量值
// 根据常见的蓝牙心率血氧服务数据格式
// 解析心率(假设在第3-4字节)
if (data.Length >= 4)
{
// 使用IEEE 11073 SFLOAT格式解析
heartRate = ParseSFLOAT(data[2], data[3]);
}
// 解析血氧饱和度(假设在第5字节)
if (data.Length >= 5)
{
// 血氧通常以百分比形式存储,直接转换为float
oxygenSaturation = (float)data[4];
}
return (heartRate, oxygenSaturation);
}
private static float ParseSFLOAT(byte b1, byte b2)
{
// IEEE 11073 SFLOAT格式解析
ushort value = (ushort)((b2 << 8) | b1);
// 提取尾数(低12位)
short mantissa = (short)(value & 0x0FFF);
// 检查是否为负数(12位有符号)
if ((mantissa & 0x0800) != 0)
{
mantissa = (short)(mantissa | 0xF000); // 符号扩展
}
// 提取指数(高4位)
sbyte exponent = (sbyte)((value >> 12) & 0x0F);
// 检查指数是否为负数(4位有符号)
if ((exponent & 0x08) != 0)
{
exponent = (sbyte)(exponent | 0xF0);
}
// 计算最终值:尾数 × 10^指数
return mantissa * (float)Math.Pow(10, exponent);
}
// 测试代码
public static void Main()
{
byte[] data = { 0, 0, 240, 0, 240 };
var result = ParseData(data);
Console.WriteLine($"心率: {result.HeartRate}");
Console.WriteLine($"血氧饱和度: {result.OxygenSaturation}%");
}
}
重要说明
-
数据格式假设:此代码基于常见的蓝牙心率血氧服务数据格式,但具体设备可能有不同的数据布局。
-
IEEE 11073 SFLOAT:
- 16位格式:尾数(12位) + 指数(4位)
- 值 = 尾数 × 10^指数
- 支持有符号数值
-
对于数据
[0, 0, 240, 0, 240]:- 心率:解析字节2-3 (240, 0)
- 血氧:直接取字节4 (240)
需要根据实际设备的通信协议来调整字节的解析顺序和位置。