您的位置:首页 > 其它

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

2011-09-22 21:58 411 查看
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编码的区别 ,可以看看这里/article/8895914.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐