udp通信中的内容
ushort cmdx = 0x13; // 在报文中占用两个字节,16进制
ushort countx = 1;//在报文中占用1个字节,ushort其实不太必要
byte [] udpsend = new byte[3];
int idx = 0;
//cmdx的赋值
udpsend[i++] = (byte)((cmdx >> 8) && 0x00FF); // ?
udpsend[i++] = (byte)(cmdx && 0x00FF); //?
//countx的赋值
udpsend[i++] = (byte)(countx && 0x00FF); // ?
从接受到的报文udprec[]中取出时候,假设报文和上面组成一样
int idy =0;
//cmdy的取值,其在报文中占两个字节
ushort cmdy = (ushort)(( udprec[idy] << 8) | (udprec[idy +1])); //?
//county的取值,其在报文中占一个字节
byte county = udprec[idy]; // ?
只要是位运算,高字节位,低字节位,经常做这方面的给讲解一下吧
------解决思路----------------------
udpsend[i++] = (byte)((cmdx >> 8) && 0x00FF); // ?
udpsend[i++] = (byte)(cmdx && 0x00FF); //?
完全可以改为如下,等价的
udpsend[i++] = (byte)(cmdx/256); // ?
udpsend[i++] = (byte)(cmdx); //?
>> 8表示右移8位,其实就是除以256
&& 0x00FF表示和0x00FF做与运算,高8位变0,低8位不变.但是你强制转byte型,本来也就只剩下8位了,根本不用管高8位原来是什么
------解决思路----------------------
想深刻理解位运算,你就必须先把16进制转成2进制,然后再去理解
比如0x13,转二进制之后:
0001,0011
每左移一位,相当于乘以2,每右移一位,相当于除以2
做与或非运算,也是按二进制来做的,按位运算就可以了
------解决思路----------------------
ushort cmdy = (ushort)(( udprec[idy] << 8)
------解决思路----------------------
(udprec[idy +1])); //?
你写入的时候,把cmdy高8位写入1个字节,低8位写入另一个字节
那么取出的时候,还是把2个字节还原成1个ushort
其实就是udprec[idy]*256+udprec[idy +1]
占4个字节,就分别不移位,移8位,移16位,移24位呗
BitConvert.GetBytes()这个在大端序,小端序的电脑上确实可能产生不一致的情况,所以我一般都是自己规定顺序,而不使用.net自带的函数
最后,计算机中存储的所有数据都是2进制的,不存在什么16进制,10进制,那些不过是转成字符串的时候按什么格式转换而已
你用VS断点看显示10进制,也可以鼠标点一下"按16进制显示",就转16进制了