C# UDP接收到的16进制数据,其中,有2字节如 “44 81”,它表示的含义是负的温度,这个两个字节如何转成负数放在Text上显示呢?
别问我们我们不知道,你需要问发给你的那个人。
因为底层C/C++从来就不喜欢用asc码,标准float,long字节,int32这样弄,他们是强迫症的,嫌这样的东西浪费字节的
下面我给个尝试猜测代码,请注意注释部分
using System.Text;
byte[] buffer = new Byte[] { 0x44, 0x81 };
//2字节能代表的东西,常规领域只能是Asc码,short,ushort
//你说可以是负数,那么可能的选择只能是1,2类型,但是short只能代表整型,无法表示浮点(小数)
//温度通常是小数,所以发给你这东西的人,有可能根据精度*10 或者*100了
short i = System.Buffers.Binary.BinaryPrimitives.ReadInt16LittleEndian(buffer);
//这样出来是-32444,很明显这不是温度范围,大概除以1000,勉强到-32.444
//在看看asc码的
string s = Encoding.ASCII.GetString(buffer);//出来是D?,很明显不是温度
//如果我们看ushort呢?ushort他是正数,那么底层C++那波从来纠结字节的人怎么弄
//他们按情况玩的,比如温度传感器最低测量温度是-40,那么-39.999+40 不就成了0.001成正数了,然后在乘以1000就是1了
//所以这个东西对于C++那波强迫症的也有可能是下面这样
ushort i1 = System.Buffers.Binary.BinaryPrimitives.ReadUInt16BigEndian(buffer);
var i2 = i1 / 1000f - 40f;//结果是-22.463
//所以总体上你别问我们,需要问那个发给你人
//需要问清楚他按大端字节序列传,还是小端字节序
//需要问清楚,他的编码计算规则是啥