如何在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个