颓废的郁闷 2022-10-19 16:53 采纳率: 100%
浏览 68
已结题

C# 16进制 2字节 比如 44 81 如何转成负数显示呢?

C# UDP接收到的16进制数据,其中,有2字节如 “44 81”,它表示的含义是负的温度,这个两个字节如何转成负数放在Text上显示呢?

  • 写回答

1条回答 默认 最新

  • wanghui0380 2022-10-19 17:40
    关注

    别问我们我们不知道,你需要问发给你的那个人。

    因为底层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
    
    //所以总体上你别问我们,需要问那个发给你人
    //需要问清楚他按大端字节序列传,还是小端字节序
    //需要问清楚,他的编码计算规则是啥
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月27日
  • 已采纳回答 10月19日
  • 修改了问题 10月19日
  • 创建了问题 10月19日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改