关于.net:如何在C#中将IP地址字符串解析为uint值?

关于.net:如何在C#中将IP地址字符串解析为uint值?

How do you parse an IP address string to a uint value in C#?

我正在编写使用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的示例外,它不可用。 :(


推荐阅读