You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将Azure IoT Hub的温湿度/电池字节数组转回原始值?

问题描述

我正尝试解码从Azure IoT Hub获取的温湿度(Temp/Humid)及电池(Bat)载荷数据。已通过C#方法解析出字节数组,但不知如何将这些字节转换回原始的十进制数值。

相关信息

传感器端原始输入数据

T=74.48
RH=45.20
BatteryVoltage:3332

传感器端(C语言)编码逻辑

float temperature = readDHTTemperature(); //this method prints T to Serial
float humidity = readDHTHumidity(); //this method prints H to Serial
uint16_t batteryVoltage = readBattery(true);
delay(100);

unsigned char *puc;

puc = (unsigned char *)(&temperature);
appDataSize = 10;
appData[0] = puc[0];
appData[1] = puc[1];
appData[2] = puc[2];
appData[3] = puc[3];


puc = (unsigned char *)(&humidity);
appData[4] = puc[0];
appData[5] = puc[1];
appData[6] = puc[2];
appData[7] = puc[3];

appData[8] = (uint8_t)(batteryVoltage>>8);
appData[9] = (uint8_t)batteryVoltage;

我的C#解析尝试

private static void BytesToString()
{
    var hexStringFromPayLoad = "MzOYQgAAHEINBA==";
    var bytes = Base64Decode(hexStringFromPayLoad);

    Console.WriteLine($"Temp: {bytes[0]}, {bytes[1]}, {bytes[2]}, {bytes[3]}");
    Console.WriteLine($"Humid: {bytes[4]}, {bytes[5]}, {bytes[6]}, {bytes[7]}");
    Console.WriteLine($"Bat: {bytes[8]}, {bytes[9]}");

    /*
    Temp: 51, 51, 152, 66
    Humid: 0, 0, 28, 66
    Bat: 13, 4
    */

//I need
// T=74.48 
// RH=45.20 
// BatteryVoltage:3332
}

需求:将上述字节数组转换为注释中所需的原始数值。


解决方案

要还原原始数值,需严格对应传感器的编码逻辑,处理字节序和数据类型映射:

1. 温湿度(float类型)转换

传感器将标准IEEE 754单精度浮点数的内存字节按**小端序(低字节在前)**存入数组,C#中可通过BitConverter.ToSingle方法转换,需注意字节序匹配:

  • 大部分Windows/Linux系统为小端序,可直接取对应字节段转换;
  • 若系统为大端序,需先反转字节数组。

2. 电池电压(uint16_t类型)转换

传感器将16位无符号整数的高8位存入appData[8],低8位存入appData[9],直接通过位运算组合即可。

完整C#实现代码

private static void BytesToString()
{
    var hexStringFromPayLoad = "MzOYQgAAHEINBA==";
    var bytes = Convert.FromBase64String(hexStringFromPayLoad); // 替换自定义的Base64Decode方法

    // 转换温度:取前4字节,小端序转float
    byte[] tempBytes = new[] { bytes[0], bytes[1], bytes[2], bytes[3] };
    // 若当前系统是大端序,需执行:Array.Reverse(tempBytes);
    float temperature = BitConverter.ToSingle(tempBytes, 0);

    // 转换湿度:取第5-8字节
    byte[] humidBytes = new[] { bytes[4], bytes[5], bytes[6], bytes[7] };
    // 若当前系统是大端序,需执行:Array.Reverse(humidBytes);
    float humidity = BitConverter.ToSingle(humidBytes, 0);

    // 转换电池电压:高8位左移8位后与低8位合并
    ushort batteryVoltage = (ushort)((bytes[8] << 8) | bytes[9]);

    // 格式化输出,保留两位小数
    Console.WriteLine($"T={temperature:F2}");
    Console.WriteLine($"RH={humidity:F2}");
    Console.WriteLine($"BatteryVoltage:{batteryVoltage}");
}

输出结果

运行后将得到目标数值:

T=74.48
RH=45.20
BatteryVoltage:3332

关键说明

  • 可通过BitConverter.IsLittleEndian判断当前系统字节序,若返回false(大端),需反转温湿度的字节数组后再转换;
  • C#的float类型与传感器的C语言float均遵循IEEE 754标准,转换无精度损失;
  • 电池电压转换时用ushort对应C语言的uint16_t,避免整数溢出问题。

内容的提问来源于stack exchange,提问作者Terrence

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:24:54