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

时间:2020-03-05 18:45:39  来源:igfitidea点击:

我正在编写使用Windows IP Helper API的Ccode。我尝试调用的功能之一是" GetBestInterface",它采用IP的" uint"表示。我需要解析IP的文本表示形式以创建" uint"表示形式。

我已经通过Google找到了一些示例,例如一个或者一个,但是我敢肯定,应该有一种使用.NET实现此目标的标准方法。唯一的问题是,我找不到这种标准方式。 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"。

回答

我从未找到针对此问题的干净解决方案(即.NET Framework中的类/方法)。我想除了我们提供的解决方案/示例或者Aku的示例外,它不可用。 :(

回答

不建议使用字节算法,因为它依赖于所有IP为4字节的IP。

回答

另外,我们还应该记住IPv4和IPv6的长度是不同的。

回答

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

与手动移位相比,此解决方案更易于阅读。

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

回答

不应该是:

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];

回答

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个