闲的没事做,离下班还有一个小时,我把我这几天了解到的一些和协议相关东西说一下。
当然我不是要说具体的某个协议,我只是讲一下看懂协议的一些基础,当然这和.net是相关的,大能请绕行
从byte说起 一个byte=8位 /8 bit. 8个位置每个位置的值都只能表示0/1。
两个byte 放到一起就是 WORD,四个byte放一起就是DWORD。
WORD,和DWORD,因为处理器架构不同,默认的字节序是不同的
举个例子 WORD是表示两个byte,16进制表示假如是 0x1234。小端序在内存的顺序会是 0x1234,大端序表示就会是0x4321。所以,实际开发中需要通过以下代码判断当前系统的是大端序存储还是小端序存储,然后跟设备发送的信息对齐,都按照大端序或者都按照小端序读取或者解析。
if (BitConverter.IsLittleEndian)
{
Array.Reverse(bytes);
}
顺着这条线往下说,一个byte可以表示0-255,即是一个int类型的如果可以表示那一定是uint8
两个byte最大值为0xffff,.net中使用ushort/uint16表示,这个很好记,16表示的是位数。
所以相应的四个byte的DWORD就是 uint32,无符号整数, 与之对应的有short/int16/int32,这些称为有符号整数。区别就是高位是否是1,高位为1表示这个数是个负数,温度信息可能是负数,那用short表示就可以。
有前边说的着一些为基础,一般基于tcp的协议应该都能看懂了。
再说一下BCD。
BCD,第一次看到的时候,惊为天人,谁发现的也太有才了。
大概意思就是用一个byte数组表示一个手机号码。按照已经编码的系统,如ASCII编码,字符1是0x31,2是0x32...
想要表示一个手机号码少说也需要11个字节。
人才就是人才啊,也不知道怎么想出来的,一个字节的字符串表示可以是0x00-0xff。
0到f,表示为数字即1-16。而手机号码只是0-9,完全可以表示,所以人家用一个字节表示手机号码中的两位,这样的话,将6个byte一字排开,缺少的位置补充0,假设手机号码是12345678901 ,那么对应的byte[]的值就会是 new byte[]{0x01,0x23,x045,0x67,0x89,0x01};。
所以用了3个汉字的长度就把手机号码表示完了。
所以如果有后来人跟帖,可以尝试用BCD编码自己的QQ号码,然后,用utf-8编码,转码成汉字,贴到后边,统一一个规则好了,QQ号码现在最多应该是10位,考虑到以后还会加,所以就按照6个byte的长度去编码,空位前补0就可以。试试看,有多少志同道合的朋友。
当然我不是要说具体的某个协议,我只是讲一下看懂协议的一些基础,当然这和.net是相关的,大能请绕行
从byte说起 一个byte=8位 /8 bit. 8个位置每个位置的值都只能表示0/1。
两个byte 放到一起就是 WORD,四个byte放一起就是DWORD。
WORD,和DWORD,因为处理器架构不同,默认的字节序是不同的
举个例子 WORD是表示两个byte,16进制表示假如是 0x1234。小端序在内存的顺序会是 0x1234,大端序表示就会是0x4321。所以,实际开发中需要通过以下代码判断当前系统的是大端序存储还是小端序存储,然后跟设备发送的信息对齐,都按照大端序或者都按照小端序读取或者解析。
if (BitConverter.IsLittleEndian)
{
Array.Reverse(bytes);
}
顺着这条线往下说,一个byte可以表示0-255,即是一个int类型的如果可以表示那一定是uint8
两个byte最大值为0xffff,.net中使用ushort/uint16表示,这个很好记,16表示的是位数。
所以相应的四个byte的DWORD就是 uint32,无符号整数, 与之对应的有short/int16/int32,这些称为有符号整数。区别就是高位是否是1,高位为1表示这个数是个负数,温度信息可能是负数,那用short表示就可以。
有前边说的着一些为基础,一般基于tcp的协议应该都能看懂了。
再说一下BCD。
BCD,第一次看到的时候,惊为天人,谁发现的也太有才了。
大概意思就是用一个byte数组表示一个手机号码。按照已经编码的系统,如ASCII编码,字符1是0x31,2是0x32...
想要表示一个手机号码少说也需要11个字节。
人才就是人才啊,也不知道怎么想出来的,一个字节的字符串表示可以是0x00-0xff。
0到f,表示为数字即1-16。而手机号码只是0-9,完全可以表示,所以人家用一个字节表示手机号码中的两位,这样的话,将6个byte一字排开,缺少的位置补充0,假设手机号码是12345678901 ,那么对应的byte[]的值就会是 new byte[]{0x01,0x23,x045,0x67,0x89,0x01};。
所以用了3个汉字的长度就把手机号码表示完了。
所以如果有后来人跟帖,可以尝试用BCD编码自己的QQ号码,然后,用utf-8编码,转码成汉字,贴到后边,统一一个规则好了,QQ号码现在最多应该是10位,考虑到以后还会加,所以就按照6个byte的长度去编码,空位前补0就可以。试试看,有多少志同道合的朋友。