【C#】一个原始的标准蓝牙心率血氧服务的数据:字节数组byte[]有5个数据分别的0、0、240、0、240,转成IEEE 11073 SFLOAT

文章目录

正文

根据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}%");
    }
}

重要说明

  1. 数据格式假设:此代码基于常见的蓝牙心率血氧服务数据格式,但具体设备可能有不同的数据布局。

  2. IEEE 11073 SFLOAT

    • 16位格式:尾数(12位) + 指数(4位)
    • 值 = 尾数 × 10^指数
    • 支持有符号数值
  3. 对于数据 [0, 0, 240, 0, 240]

    • 心率:解析字节2-3 (240, 0)
    • 血氧:直接取字节4 (240)

需要根据实际设备的通信协议来调整字节的解析顺序和位置。

相关推荐
gc_229915 小时前
C#学习调用OpenMcdf模块解析ole数据的基本用法(2)
c#·ole·openmcdf·offvis软件
bugcome_com15 小时前
C# 变量详解(从入门到掌握)
c#
kylezhao201915 小时前
C#中如何防止序列化文件丢失和损坏
c#
玩c#的小杜同学16 小时前
工业级稳定性:如何利用生产者-消费者模型(BlockingCollection)解决串口/网口高频丢包问题?
笔记·学习·性能优化·c#·软件工程
游乐码19 小时前
c#结构体
开发语言·c#
bugcome_com21 小时前
# C# 变量作用域详解
开发语言·c#
三方测试小学徒1 天前
GB/T 34946-2017《C#语言源代码漏洞测试规范》之整体解读
c#·cma·cnas·34946
光泽雨1 天前
P/Invok执行时的搜索顺序
c#