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

willhuo 2015-01-06 11:05:17
最近没事研究一下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);
...全文
400 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
willhuo 2015-01-06
  • 打赏
  • 举报
回复
有没有意义不要问了,没有意义我也不会问他的。只要解决问题即可,至于怎么操作,我自由打算
ghao0 2015-01-06
  • 打赏
  • 举报
回复
学习,帮忙顶一下, 不过高深的很多懂得人不愿意传播
於黾 2015-01-06
  • 打赏
  • 举报
回复
那你加油吧 反正我是没看出这样做有任何意义 底层已经实现了的东西自己重新封,你是要自己创造一个操作系统吗 我觉得有这个精力,还是多研究一些业务上的问题,而不要一味的纠结底层
willhuo 2015-01-06
  • 打赏
  • 举报
回复
引用 楼主 willhuo 的回复:
最近没事研究一下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); 
额,我的意思是。。我在做SYN的封包,TCP三次握手中的第一次握手封包,全部手动封。。。就是想知道底层的东西。。。。意义就是加深学习
於黾 2015-01-06
  • 打赏
  • 举报
回复
不明白你研究这个有什么意义 数据包封装是在网络层封装的,跟你应用层没一毛钱关系,你直接告诉socket要发送到的IP地址字符串就好,具体怎么转换,大端序和小端序怎么转,都封装好了,你解析成byte数组又想把它发送到哪里?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧