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

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

相关推荐
xiaoshuaishuai84 小时前
C# Codex 脚本编写
java·服务器·数据库·c#
weixin_447443257 小时前
AI启蒙Lean4
python·c#
我是唐青枫10 小时前
C#.NET ValueTaskSource 深入解析:零分配异步、ManualResetValueTaskSourceCore 与使用边界
c#·.net
iCxhust11 小时前
C#程序,窗体1向窗体2的textbox控件写入字符串“hello”
开发语言·c#
iCxhust11 小时前
C#如何实现textbox文本多行输出 且自动换行输出
开发语言·c#
政沅同学14 小时前
C# 一种很好用的设计模式 不同对象之间进行解耦通信
设计模式·c#
咩图15 小时前
C#进程通讯-命名管道通讯
c#·命名管道·进程通讯
SunnyDays101115 小时前
如何使用 C# 高效实现 Excel 与 CSV 的互相转换
c#·excel·csv
Byron Loong15 小时前
【网络】C#TCP 通讯
网络·tcp/ip·c#
geovindu15 小时前
密码进行加盐哈希 using CSharp,Python,Go,Java
java·python·golang·c#·哈希算法