【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)

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

相关推荐
晨星shine3 天前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
用户298698530143 天前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
用户3667462526743 天前
接口文档汇总 - 2.设备状态管理
c#
用户3667462526743 天前
接口文档汇总 - 3.PLC通信管理
c#
Ray Liang4 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Scout-leaf7 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
用户298698530147 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
mudtools8 天前
搭建一套.net下能落地的飞书考勤系统
后端·c#·.net
玩泥巴的9 天前
搭建一套.net下能落地的飞书考勤系统
c#·.net·二次开发·飞书
唐宋元明清21889 天前
.NET 本地Db数据库-技术方案选型
windows·c#