English 中文(简体)
如何在C#中将IP地址字符串解析为uint值?
原标题:
  • 时间:2008-08-31 12:35:30
  •  标签:

我正在编写使用windows IP Helper API的C#代码。我试图调用的函数之一是“GetBestInterface”,它采用IP的uint表示。我需要的是解析IP的文本表示来创建uint表示。

我通过谷歌找到了一些例子,比如这个这个,但我很确定应该有一种标准的方法来用.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];

EDIT:
As other commenters noticed above-mentioned code is for IPv4 addresses only. IPv6 address is 128 bits long so it s impossible to convert it to uint as question s author wanted.

问题回答

不应该是:

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

?

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

这种解决方案比手动移位更容易阅读。

请参阅如何将IPv4地址转换为C#中的整数

此外,您还应该记住IPv4IPv6是不同的长度。

符合Endianness的正确解决方案:

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

不鼓励使用字节运算,因为它依赖于所有IP都是4个八位字节的IP。

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

Output will be 192 168 1 1

完整的解决方案:

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

http://www.silisoftware.com/tools/ipconverter.php

对于这个问题,我从来没有找到一个干净的解决方案(即:.NET Framework中的类/方法)。我想除了你提供的解决方案/例子或Aku的例子之外,它是不可用的。:(





相关问题
热门标签