两个byte(高低位)组成一个int16

lccleo 2016-01-25 08:50:52
问题是这样的
下位机有个值是-5345,大家知道5345用16进制表示是 0xeb1f,所以下位机发送给我两个 字节(byte) eb和 1f
但是我收到这两个字节怎么组合成-5345


我现在用的方法是 eb左移8位(高位) 加上 1f(低位)
但是eb左移8位后就超过了 int16的最大值,造成了数据溢出的异常,求教一下大家,谢谢
...全文
4968 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-01-26
  • 打赏
  • 举报
回复
            var b = new byte[] { 0xeb, 0x1f };
            Console.WriteLine(BitConverter.ToInt16(new byte[] { b[1], b[0] }, 0));
            Console.WriteLine(Convert.ToInt16((b[0].ToString("X2") + b[1].ToString("X2")), 16));
            Console.WriteLine((Int16)Convert.ToUInt16((b[0] << 8) + b[1]));
三种都可以
本拉灯 2016-01-26
  • 打赏
  • 举报
回复
你的方式是对的,不过高低位弄错了。 byte[] b = { 0x1f, 0xeb }; short sxaa = (short)(b[0] | b[1] << 8); 或 short i = BitConverter.ToInt16(b, 0);
Saleayas 2016-01-26
  • 打赏
  • 举报
回复
BitConverter..::.ToInt16 方法
cs1438250 2016-01-26
  • 打赏
  • 举报
回复
引用 4 楼 lccleo 的回复:
[quote=引用 3 楼 cs1438250 的回复:] 昨天刚做完。。。 byte a[2]; 放你的2个数值,高位低位自己找好。 Convert.ToInt16((a[0].ToString("X2") + a[1].ToString("X2")), 16)
这个是可以的,我之前想到了,没用是因为怕转化成string会有问题,还有其他办法没?直接通过数值运算 先感谢下你,没其他回答分只能是你的了[/quote] 怕转化成string有什么问题?
cs1438250 2016-01-26
  • 打赏
  • 举报
回复
引用 4 楼 lccleo 的回复:
[quote=引用 3 楼 cs1438250 的回复:] 昨天刚做完。。。 byte a[2]; 放你的2个数值,高位低位自己找好。 Convert.ToInt16((a[0].ToString("X2") + a[1].ToString("X2")), 16)
这个是可以的,我之前想到了,没用是因为怕转化成string会有问题,还有其他办法没?直接通过数值运算 先感谢下你,没其他回答分只能是你的了[/quote] 有符号数啊。2byte的 大于7fff,就是负数。。还得考虑正负转换。。c#给封装好了就用吧。。 modbus昨天我也刚写了个程序。 ToString("X2") 转化成字符串十六进制,不足两位,补齐两位。
assky124 2016-01-26
  • 打赏
  • 举报
回复


    class Program
    {
        static void Main(string[] args)
        {
            byte b1 = 0xeb;
            byte b2 = 0x1f;

            UInt16 val = Convert.ToUInt16((b1 << 8) + b2);
            Console.WriteLine((Int16)val);
            Console.WriteLine(val.ToString("X"));
            Console.ReadKey();
        }
    }

lccleo 2016-01-26
  • 打赏
  • 举报
回复
引用 3 楼 cs1438250 的回复:
昨天刚做完。。。 byte a[2]; 放你的2个数值,高位低位自己找好。 Convert.ToInt16((a[0].ToString("X2") + a[1].ToString("X2")), 16)
这个是可以的,我之前想到了,没用是因为怕转化成string会有问题,还有其他办法没?直接通过数值运算 先感谢下你,没其他回答分只能是你的了
cs1438250 2016-01-26
  • 打赏
  • 举报
回复
昨天刚做完。。。 byte a[2]; 放你的2个数值,高位低位自己找好。 Convert.ToInt16((a[0].ToString("X2") + a[1].ToString("X2")), 16)
秋的红果实 2016-01-25
  • 打赏
  • 举报
回复
不懂上下位机,但我知道计算机里要规定是2字节,那么运算中超出的就要从高位舍去,开始新的一个轮回,像23点+1就成了0点了,舍掉24从0开始
Poopaye 2016-01-25
  • 打赏
  • 举报
回复
unchecked { //你的运算 }

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧