IP地址转换成网络字节顺序疑问

willhuo willhuo 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近没事研究一下TCP通信协议,在大字节小字节转换时碰到了一些疑问,描述下。

在构建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);
...全文
评论 5
收藏 已收藏
分享
返回顶部
willhuo
C# 111,128 成员 642,536 内容