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

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

相关推荐
王莎莎-MinerU1 小时前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
-银雾鸢尾-1 小时前
C#中Object类内的方法
开发语言·c#
geats人山人海4 小时前
c# 第九章 record
开发语言·c#
-银雾鸢尾-5 小时前
C#中的抽象类与抽象方法
开发语言·c#
影寂ldy5 小时前
C# Task 进阶:WaitAll / WaitAny / WhenAll / WhenAny
开发语言·c#
咏方舟【长江支流】6 小时前
【编程】(1)-跨平台跨语言C#、Java、鸿蒙ArkTS三端通用实体接口
java·c#·ai编程·harmonyos·arkts·咏方舟-长江支流·用宝框架
o5278831846 小时前
校园一体化管理系统2.1、基于整洁四层架构 + DDD+CQRS 项目目录解读
后端·架构·c#·asp.net·visual studio
农村小镇哥1 天前
C#中的字符串格式化
服务器·开发语言·c#