使用Socket从网络上接收到一个8个字节的数据包,
是从16位系统的PLC中发送过来的十六进制数据包,原数据如下:FFEE AAEE AACC AA11
共8个字节,每两个字节表示一个数据(也就是16位)使用Socket将读到的字节存入到缓存中( byte[] buffer)断点调试时,看到的是buffer[0]:255   --- 对应16进制为:FF
buffer[1]:238   --- 对应16进制为:EE
buffer[2]:170   --- 对应16进制为:AA
buffer[3]:238   --- 对应16进制为:EE
buffer[4]:170   --- 对应16进制为:AA
buffer[5]:204   --- 对应16进制为:CC
buffer[6]:170   --- 对应16进制为:AA
buffer[7]:17    --- 对应16进制为:11也就是说,如PLC发送过来的数据是匹配无误的由于这还只是byte数据,需要将每2字节转码成1个16位的无符号整数,
于是用到了BitConverter.ToUInt16(byte[] byteArray,int startIndex)
这个方法对应的转换后为:
BitConverter.ToUInt16(buffer,0) = 61183BitConverter.ToUInt16(buffer,2) = 61098BitConverter.ToUInt16(buffer,4) = 52394BitConverter.ToUInt16(buffer,6) = 4522而正确的值应该分别为:65518,43758,43724,43537通过不断的调试发现,原来是BitConvert.ToUInt16将字节的位置对换了,
比如buffer的前两字节为 255 230 也就是FFEE(65518) ,但是BitConverter在转换时是用的EEFF(61183),
于是对应的数据就发生了改变!
所以,我想知道,为什么BitConverter会改变读取字节的顺序,如何纠正这种错误的转换?
因为buffer数据接收到的数据的顺序貌似是正确的,为何为在BitConvert这里发生问题?

解决方案 »

  1.   

    byte[0]表示最低位,依次向上。FFEE(65518)这个整数对应的字节数组(16位)是byte[0]=238,byte[1]=255.
    接收到的buffer里面的字节顺序是反向的,你可以再定义个byte数组,填充正确的顺序后再转换。
      

  2.   


    能给点关键性代码提示不,没太看明白,还是不知道buffer内的字节和字节数组为何会解析成相反的顺序
      

  3.   

       ushort _Value = (ushort)(buffer[0] << 8 | buffer[1]);
      

  4.   

     byte[] bs = BitConverter.GetBytes(0x1234);
                Console.WriteLine(bs[0].ToString("X2") + " " + bs[1].ToString("X2"));
                // output: 34 12  低位在前,高位在后 
                byte[] bs2 = BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder((short)0x1234));
                Console.WriteLine(bs2[0].ToString("X2") + " " + bs2[1].ToString("X2"));
                // output: 12 34 高位在前,低位在后             byte[] bs3 = BitConverter.GetBytes(0x1234);
                Array.Reverse(bs3);
                Console.WriteLine(bs3[0].ToString("X2") + " " + bs3[1].ToString("X2"));
                // output: 12 34 高位在前,低位在后