通信协议 数据转换辅助类ProtocolHelper1

来源:互联网 发布:ie无法打开淘宝网 编辑:程序博客网 时间:2024/04/30 15:10
        public static uint CalValueFromHex(Byte[] buf, int start, int len)        {            uint value;            Byte c;            int i, p;            value = 0;            p = start;            for (i = 0; i < len; i++)            {                c = buf[p++];                value += (uint)(c << (8 * (len - i - 1)));            }            return value;        }        public static ulong CalUlongValueFromHex(Byte[] buf, int start, int len)        {            ulong value;            Byte c;            int i, p;            value = 0;            p = start;            for (i = 0; i < len; i++)            {                c = buf[p++];                value += ((ulong)c << (8 * (len - i - 1)));            }            return value;        }        public static int GetValueUInt(Byte[] buf, int start, int len, ref uint value)        {            value = CalValueFromHex(buf, start, len);            return len;        }        public static int GetValueInt(Byte[] buf, int start, int len, ref int value)        {            value = (int)CalValueFromHex(buf, start, len);            return len;        }        public static int GetValueULong(Byte[] buf, int start, int len, ref ulong value)        {            value = CalUlongValueFromHex(buf, start, len);            return len;        }        public static int GetValueLong(Byte[] buf, int start, int len, ref long value)        {            value = (long)CalUlongValueFromHex(buf, start, len);            return len;        }        public static int GetDateTime(Byte[] buf, int start, int len, ref DateTime time)        {            try            {                int year, month, day, hour, minute, second;                year = (int)CalValueFromHex(buf, start++, 1);                month = (int)CalValueFromHex(buf, start++, 1);                day = (int)CalValueFromHex(buf, start++, 1);                hour = (int)CalValueFromHex(buf, start++, 1);                minute = (int)CalValueFromHex(buf, start++, 1);                second = (int)CalValueFromHex(buf, start++, 1);                year += 2000;                time = new DateTime(year, month, day, hour, minute, second);                return 6;            }            catch (Exception)            {                time = new DateTime(2000,1,1,0,0,0);            }                       return 6;        }        public static int GetUTF8String1(Byte[] buf, int start, ref string str)        {            int len;            len = buf[start];            str = Encoding.UTF8.GetString(buf, start + 1, len);            return len + 1;        }        public static int GetString1(Byte[] buf, int start, ref string str)        {            int len;            len = buf[start];            str = Encoding.ASCII.GetString(buf, start + 1, len);            return len + 1;        }        public static int GetData2(Byte[] buf, int start, ref byte[] bufOut, ref int bufOutLen)        {            int i;            uint len;            len = CalValueFromHex(buf, start, 2);            bufOutLen = (int)len;            for (i = 0; i < bufOutLen; i++)            {                bufOut[i] = buf[i + start + 2];            }            return (int)len + 2;        }


 

 

 

 

 

 

重点理解这句:ue += (uint)(c << (8 * (len - i - 1)));右移符号(<<)就是移n为,这该数值就增大到原来的2的n次方被

比如字节数组有[49][50][51]这三个字节,其二进制为:110001,00110010,00110011

CalValueFromHex(buf, int 0,1)是要取最高位的字节(即110001),也就是得到49,c << (8 * (len - i - 1)),1-0-1=0;移0位,所以还是49

CalValueFromHex(buf, int 0,2)是要取头两字节(即11000100110010)这个二进制的十进制数据就是49*256+50=12594,现在就可以理解c << (8 * (len - i - 1))的作用了,就是高位字节因移位变大了,右移1(取了两字节)位,最高字节得知变为原来的2的8次方倍,也就是原来的256倍,这个等价于c << (8 * (len - i - 1)),理解这个其他的也就OK了。

 

 

Ansi,UTF8,Unicode,ASCII编码的区别 ,可以看看这里http://blog.csdn.net/xiongxiao/article/details/3741731

 

原创粉丝点击