关于.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的示例外,它不可用。 :(


推荐阅读

    linux修改地址命令?

    linux修改地址命令?,地址,系统,代码,网络,服务,信息,密码,命令,管理,基础,lin

    linux内核总调用命令?

    linux内核总调用命令?,工作,地址,系统,信息,管理,策略,命令,目录,时间,基础,

    linux查看命令的地址?

    linux查看命令的地址?,地址,系统,网络,信息,设备,电脑,手机,终端,技术,环境,l

    linux编程调用命令?

    linux编程调用命令?,系统,标准,管理,工作,基础知识,情况,环境,设备,基础,首

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux地址查询命令?

    linux地址查询命令?,地址,网络,系统,工作,信息,设备,名称,标准,手机,管理,lin

    linux撤销命令解析?

    linux撤销命令解析?,系统,标准,工具,下来,数字,工作,命令,环境,设备,位置,lin

    linux命令窗口调用?

    linux命令窗口调用?,系统,工具,首页,终端,命令,数据,盘中,代码,密码,快捷键,

    linux带源地址命令?

    linux带源地址命令?,时间,地址,数据,网络,系统,信息,档案,命令,名称,名字,Lin

    linux服务器调用命令?

    linux服务器调用命令?,系统,地址,设备,标准,工作,密码,中心,盘中,网络,软件,

    linuxc调用命令框?

    linuxc调用命令框?,系统,工作,标准,情况,设备,环境,命令,函数,语言,程序,如何

    linux系统调用命令行?

    linux系统调用命令行?,系统,网络,代码,密码,位置,工作,通用,平台,电脑,环境,

    批量调用linux命令?

    批量调用linux命令?,工具,下来,软件,系统,密码,地址,时间,认证,向日葵,文件,l

    linux命令查看地址?

    linux命令查看地址?,地址,网络,系统,信息,电脑,数字,设备,管理,终端,命令,lin

    linux解析jar命令?

    linux解析jar命令?,平台,工程,工具,文件,标准,名称,环境,项目,电脑,系统,linu

    linux看网关地址命令?

    linux看网关地址命令?,地址,网络,信息,系统,网关,设备,密码,管理,服务,单位,L

    linux命令解析模板化?

    linux命令解析模板化?,系统,工作,地址,命令,位置,目录,管理,最新,数据,通讯

    linux地址转换命令?

    linux地址转换命令?,地址,系统,代码,信息,设备,网络,服务,密码,状态,报告,lin

    linux命令修改ip地址?

    linux命令修改ip地址?,地址,系统,代码,网络,信息,密码,服务,工具,设备,命令,

    linux内核调用命令?

    linux内核调用命令?,系统,工作,信息,工具,内核,命令,名称,标准,流程,网络,在l