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位原来是什么

解决方案 »

  1.   

    问题有些多,请不吝赐教
    cmdy的取值如何解释,另外如果占用4个字节的话,如何写用BitConvert.GetBytes()也可以取位运算,担心运算后得到的数组和报文要求不一致报文网络传输时候用的是16进制吧,说是4个bit对应一个16进制位,能减少传输量
    我用sockit模拟服务器应答回复 w x s三个字母,从网络抓包中看是16进制,从vs中断点调试显示10进制,是不是传输16进制,计算机收到后转转到2进制,IDE呈现给人的时候转换成10进制?
      

  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进制了