如何在C#中将IP地址字符串解析为uint值?

我正在编写使用Windows IP Helper API的C#代码。 我试图调用的函数之一是“ GetBestInterface ”,它采用IP的“uint”表示。 我需要的是解析IP的文本表示以创建’uint’表示。

我已经通过谷歌找到了一些例子,比如这个或者这个例子,但我很确定应该有一种标准的方法来实现这一点。 唯一的问题是,我找不到这种标准方式。 IPAddress.Parse似乎是在正确的方向,但它没有提供任何方式获得’uint’表示…

还有一种方法可以使用IP Helper,使用ParseNetworkString ,但同样,我宁愿使用.NET – 我相信我越少依赖pInvoke就越好。

那么,有谁知道在.NET中执行此操作的标准方法?

MSDN 说 IPAddress.Address属性(返回IP地址的数字表示)已过时,您应该使用GetAddressBytes方法。

您可以使用以下代码将IP地址转换为数值:

var ipAddress = IPAddress.Parse("some.ip.address"); var ipBytes = ipAddress.GetAddressBytes(); var ip = (uint)ipBytes [3] << 24; ip += (uint)ipBytes [2] << 16; ip += (uint)ipBytes [1] <<8; ip += (uint)ipBytes [0]; 

编辑:
正如其他评论者所注意到的,上述代码仅用于IPv4地址。 IPv6地址长度为128位,因此不可能像问题的作者那样将其转换为“uint”。

不应该是:

 var ipAddress = IPAddress.Parse("some.ip.address"); var ipBytes = ipAddress.GetAddressBytes(); var ip = (uint)ipBytes [0] << 24; ip += (uint)ipBytes [1] << 16; ip += (uint)ipBytes [2] <<8; ip += (uint)ipBytes [3]; 

 var ipuint32 = BitConverter.ToUInt32(IPAddress.Parse("some.ip.address.ipv4").GetAddressBytes(), 0);` 

该解决方案比手动位移更容易阅读。

请参阅如何将IPv4地址转换为C#中的整数?

您还应该记住IPv4和IPv6的长度不同。

不鼓励字节算术,因为它依赖于所有4个八位字节的IP。

 System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse("192.168.1.1"); byte[] bytes = ipAddress.GetAddressBytes(); for (int i = 0; i < bytes.Length ; i++) Console.WriteLine(bytes[i]); 

输出将是192 168 1 1

我从来没有找到一个干净的解决方案(即:.NET Framework中的类/方法)来解决这个问题。 我想除了您提供的解决方案/示例或Aku的示例之外,它不可用。 🙁

完整解决方案

 public static uint IpStringToUint(string ipString) { var ipAddress = IPAddress.Parse(ipString); var ipBytes = ipAddress.GetAddressBytes(); var ip = (uint)ipBytes [0] << 24; ip += (uint)ipBytes [1] << 16; ip += (uint)ipBytes [2] <<8; ip += (uint)ipBytes [3]; return ip; } public static string IpUintToString(uint ipUint) { var ipBytes = BitConverter.GetBytes(ipUint); var ipBytesRevert = new byte[4]; ipBytesRevert[0] = ipBytes[3]; ipBytesRevert[1] = ipBytes[2]; ipBytesRevert[2] = ipBytes[1]; ipBytesRevert[3] = ipBytes[0]; return new IPAddress(ipBytesRevert).ToString(); } 

字节的反向顺序:

 public static uint IpStringToUint(string ipString) { return BitConverter.ToUInt32(IPAddress.Parse(ipString).GetAddressBytes(), 0); } public static string IpUintToString(uint ipUint) { return new IPAddress(BitConverter.GetBytes(ipUint)).ToString(); } 

你可以在这里测试:

https://www.browserling.com/tools/dec-to-ip

http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx

http://www.silisoftware.com/tools/ipconverter.php