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

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

相关推荐
jiayong2313 小时前
海量数据处理技术方案与实现原理
大数据·c#·linq
z落落17 小时前
C# 类与对象、字段、静态与非静态+四大访问修饰符
开发语言·c#
魔法阵维护师17 小时前
从零开发游戏需要学习的c#模块,第三十二章(Boss 战系统)
学习·游戏·c#
魔法阵维护师17 小时前
从零开发游戏需要学习的c#模块,第三十三章(暂停菜单)
学习·游戏·c#
z落落18 小时前
C# Stack栈 / Queue队列+所有集合 终极一页汇总(全覆盖、零遗漏)
java·开发语言·c#
淡海水19 小时前
08-认知篇-对比-injectfix深度解析
unity·c#·热更新·clr·hybrid·injectfix
周杰伦fans1 天前
C# 踩坑 CS8370:Switch Expression 在 C# 7.3 不可用及三种解决方案
c#
z落落1 天前
C# ToCharArray + foreach遍历 + String与StringBuilder
开发语言·c#
xiaoshuaishuai81 天前
C# AvaloniaUI动态显示图片
开发语言·c#