我正在编写使用Windows IP Helper API的C#代码。我尝试调用的功能之一是" GetBestInterface",它采用IP的" uint"表示。我需要解析IP的文本表示形式以创建'uint'表示形式。
我已经通过Google找到了一些示例,例如一个或一个,但是我敢肯定,应该有一种使用.NET实现此目标的标准方法。唯一的问题是,我找不到这种标准方式。 IPAddress.Parse似乎是朝着正确的方向发展,但是它并没有提供任何获取'uint'表示形式的方法...
还有一种使用IP Helper,使用ParseNetworkString进行此操作的方法,但是我还是宁愿使用.NET-我相信我对pInvoke的依赖程度越低越好。
那么,有人知道在.NET中执行此操作的标准方法吗?
应该不是:
1 2 3 4 5 6
| 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]; |
?
MSDN表示IPAddress.Address属性(返回IP地址的数字表示形式)已过时,应使用GetAddressBytes方法。
您可以使用以下代码将IP地址转换为数值:
1 2 3 4 5 6
| 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'。
1
| var ipuint32 = BitConverter.ToUInt32(IPAddress.Parse("some.ip.address.ipv4").GetAddressBytes(), 0);` |
此解决方案比手动移位更易于阅读。
请参阅如何在C#中将IPv4地址转换为整数?
此外,您还应该记住IPv4和IPv6的长度是不同的。
观察字节序的正确解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var ipBytes = ip.GetAddressBytes();
ulong ip = 0;
if (BitConverter.IsLittleEndian)
{
ip = (uint) ipBytes[0] << 24;
ip += (uint) ipBytes[1] << 16;
ip += (uint) ipBytes[2] << 8;
ip += (uint) ipBytes[3];
}
else
{
ip = (uint)ipBytes [3] << 24;
ip += (uint)ipBytes [2] << 16;
ip += (uint)ipBytes [1] <<8;
ip += (uint)ipBytes [0];
} |
完整解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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();
} |
字节的相反顺序:
1 2 3 4 5 6 7 8 9
| 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
1 2 3 4 5
| 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
不建议使用字节算法,因为它依赖于所有IP为4字节的IP。
我从未找到针对此问题的干净解决方案(即.NET Framework中的类/方法)。我想除了您提供的解决方案/示例或Aku的示例外,它不可用。 :(