我正在编写使用Windows IP Helper API的C#代码。我试图调用的函数之一是“GetBestInterface”,它采用IP的'uint'表示。我需要的是解析IP的文本表示以创建'uint'表示。
我在Google上找到了一些例子,例如this one或this one,但我很确定应该有一种标准的方法来实现这一点。唯一的问题是,我找不到这种标准方式。 IPAddress.Parse似乎是在正确的方向,但它没有提供任何获得'uint'表示的方式......
还有一种使用IP Helper的方法,使用ParseNetworkString,但同样,我宁愿使用.NET - 我相信我越少依赖pInvoke就越好。
那么,有谁知道在.NET中执行此操作的标准方法?
答案 0 :(得分:16)
不应该是:
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];
答案 1 :(得分:11)
MSDN says表示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”。
答案 2 :(得分:10)
var ipuint32 = BitConverter.ToUInt32(IPAddress.Parse("some.ip.address.ipv4").GetAddressBytes(), 0);`
此解决方案比手动位移更容易阅读。
答案 3 :(得分:5)
答案 4 :(得分:1)
不鼓励使用字节算法,因为它依赖于所有4个八位字节的IP。
答案 5 :(得分:1)
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
答案 6 :(得分:1)
观察字节序的正确解决方案:
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];
}
答案 7 :(得分:0)
我从来没有找到一个干净的解决方案(即:.NET Framework中的类/方法)来解决这个问题。我想除了您提供的解决方案/示例或Aku的示例之外,它不可用。 :(
答案 8 :(得分:0)
完整的解决方案:
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