如何在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
相关产品推荐
相关产品推荐

