zoukankan      html  css  js  c++  java
  • [置顶] 通信协议中多字节数据的解析

         在自定义通信协议中,如果采用字节流形式的的方式。就特别注意多字节数据的解析。此处以整形数据为例进行讲解。

      

       例如:通信协议中规定整个数据帧长度为整形,占用两个字节。

        则数据帧长度257转化为字节数组为:byte[0]=2,byte[1]=1,发送数据时先发送字节byte[0],再发送字节byte[1]

        则在服务端解析时,计算的数据的正确方式就是byte[0]+byte[1]*256=258,错误的为byte[0]*256+byte[1]=513

       相反如果客户端先发送byte[1],在发送byte[0],则在服务端解析式的正确方式就是byte[0]*256+byte[1]=258,错误的为byte[0]+byte[1]*256=513

        如果这些细节没有严格规定,就会导致解析错误。

        这些都是需要注意的细节,虽然琐碎,但不注意却会导致解析失败。

      因此字节流通信协议双方必须严格按照通信协议处理数据。通信协议必须规定每一个字节的含义,以及多字节数据的存储顺序,否则就会导致解析错误。


    几个常用的数值转换字节数组的函数:

     
            /// <summary>
            /// 把数字转化为数组 地位存低字节,高位存高字节
    
            /// </summary>
            /// <param name="x"></param>
            /// <param name="length"></param>
            /// <returns></returns>
            static byte[] IntToBytes(int x, int length)
            {
                byte[] b = new byte[length];
                int temp = x;
                for (int i = 0; i <= length - 1 && i < 4; i++)
                {
                    b[i] = (byte)((x >> (i * 8)));
                }
                return b;
            }
            /// <summary>
            ///把数组转化为数字  解析地位存低字节,高位存高字节
    
            /// </summary>
            /// <param name="b"></param>
            /// <param name="length"></param>
            /// <returns></returns>
            static int BytesToInt(byte[] b, int length)
            {
                int temp = 0;
                for (int i = 0; i <= length - 1 && i < 4; i++)
                {
                    temp += (int)(b[i] << (i * 8));
                }
                return temp;
            }


  • 相关阅读:
    SDUT-3376_数据结构实验之查找四:二分查找
    SDUT-3375_数据结构实验之查找三:树的种类统计
    SDUT-3373_数据结构实验之查找一:二叉排序树
    深度优先遍历和广度优先遍历
    SDUT-2498_AOE网上的关键路径
    SDUT-2140_判断给定图是否存在合法拓扑序列
    SDUT-2144_最小生成树
    SDUT-3364_欧拉回路
    SDUT-3363_驴友计划
    Java练习 SDUT-2271_Eddy的难题
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3289797.html
Copyright © 2011-2022 走看看