IP地址转换成网络字节顺序疑问
最近没事研究一下TCP通信协议,在大字节小字节转换时碰到了一些疑问,描述下。
在构建TCP数据包的时候,需要将IP地址和端口转换成无符号32位的网络字节顺序。
例如 192.168.1.101 ,转换成16进制为 C0 A8 01 68
按照网络字节顺序的描述,转换后的字符串应该是 68 01 A8 C0(16进制表示)
这个可以手动实现,结果:6501A8C0,跟我们预想的一样,代码如下。
但是在网上看了很多例子,但是在测试的时候碰到了问题,结果:C0A80165,这是个正常顺序,并没有倒序,代码如下。
我查了一下bitconverter类在MSDN的描述,关于大小字节的转换,如果本地系统是小字节的存储格式,bitconverter类在转换的时候,顺序是到的。
那岂不是第二个代码中的Array.Reverse(arr)就没有必要了,本地系统是小字节存储,直接利用bitconverer类进行转换的时候,直接就成了倒序的,也就是网络字节顺序(大字节),不知道这样对不对。
小弟初涉TCP的协议内部情况,不知道我理解的有没有问题。
IP地址转换成网络自己顺序,代码修改如下
在构建TCP数据包的时候,需要将IP地址和端口转换成无符号32位的网络字节顺序。
例如 192.168.1.101 ,转换成16进制为 C0 A8 01 68
按照网络字节顺序的描述,转换后的字符串应该是 68 01 A8 C0(16进制表示)
这个可以手动实现,结果:6501A8C0,跟我们预想的一样,代码如下。
string ipStr = "192.168.1.101";
string[] array = ipStr.Split('.');
byte[] array2=new byte[array.Length];
for (int i = 0; i < array2.Length; i++)
{
array2[i] = (byte)Convert.ToInt32(array[i]);
textBox1.AppendText(array2[i].ToString("X")+"\r\n");
}
uint u = 0;
for (int i = 0; i < array2.Length; i++)
{
u += (uint)array2[i] << (i * 8);
}
textBox1.AppendText(u.ToString("X")+"\r\n");
但是在网上看了很多例子,但是在测试的时候碰到了问题,结果:C0A80165,这是个正常顺序,并没有倒序,代码如下。
IPAddress ip =IPAddress.Parse("192.168.1.101");
byte[] arr = ip.GetAddressBytes();
Array.Reverse(arr);
uint ipui = BitConverter.ToUInt32(arr, 0);
我查了一下bitconverter类在MSDN的描述,关于大小字节的转换,如果本地系统是小字节的存储格式,bitconverter类在转换的时候,顺序是到的。
那岂不是第二个代码中的Array.Reverse(arr)就没有必要了,本地系统是小字节存储,直接利用bitconverer类进行转换的时候,直接就成了倒序的,也就是网络字节顺序(大字节),不知道这样对不对。
小弟初涉TCP的协议内部情况,不知道我理解的有没有问题。
IP地址转换成网络自己顺序,代码修改如下
IPAddress ip =IPAddress.Parse("192.168.1.101");
byte[] arr = ip.GetAddressBytes();
//Array.Reverse(arr); //忽略倒序操作,bitconverter可以直接倒序
uint ipui = BitConverter.ToUInt32(arr, 0);
...全文


