通信协议 数据转换辅助类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
相关文章推荐
- 通信协议 数据写入字节数组的辅助类ProtocolHelper2
- 通信协议之Protocol buffer(Java篇)
- Redis--protocol(通信协议)
- 将硬件规定的通信协议用Lua实现(涉及到很多Lua通信的数据转换)
- 通信协议之Protocol buffer(Java篇)
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 稳扎稳打Silverlight(55) - 4.0通信之对UDP协议的支持: 通过 UdpSingleSourceMulticastClient 实现 SSM(Source Specific Multicast),即“源特定多播”
- 稳扎稳打Silverlight(55) - 4.0通信之对UDP协议的支持: 通过 UdpSingleSourceMulticastClient 实现 SSM(Source Specific Multicast),即“源特定多播”
- 稳扎稳打Silverlight(55) - 4.0通信之对UDP协议的支持: 通过 UdpSingleSourceMulticastClient 实现 SSM(Source Specific Multicast),即“源特定多播”
- POP3是收邮件的协议,SMTP是发邮件的协议,IMAP是一种邮箱通信协议。
- GTP(GPRS Tunnelling Protocol)协议
- [笔记]NFC笔记——NFCIP-1协议命令集(NFCIP-1 Protocol Command Set)
- 分布式基础通信协议:paxos,totem和gossip
- 网络通信协议
- 检测到通信错误。正在使用的通信协议:"TCP/IP"。正在使用的通信API:"SOCKETS"。检测到错误的位置:""。检测到错误的通信函数:"gethostbyname"。协议特定的错误代码:"*"、"11004"、"*"。 SQLST
- 【iOS开发】协议与委托 (Protocol and Delegate)
- P2P通信标准协议:SIP
- iPhone应用中Protocol协议使用方法
- Google的数据交换协议:GData (Google Data APIs Protocol)