You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从反转IPv4地址获取正确的长整型十进制地址?

IPv4地址转十进制及子网划分问题

我正在用C#开发IPv4地址子网划分工具,尝试过IpNetwork2等第三方库,但无法在现有项目中加载使用。于是转而改造PowerShell的SubnetTools模块来满足需求,不过该模块依赖已废弃的IpAddress.Address属性,因此需要自己实现地址转换逻辑。

现有转换代码及问题

原参考代码如下:

public int GetAddress(string ipAddress)
{
    string hex = string.Concat(ipAddress.Split('.').Reverse().Select(x => int.Parse(x).ToString("X").PadLeft(2, '0'))); // 0100007F 
    return Convert.ToInt32(hex, 16); //16777343
}

这段代码处理常规IP地址时输出符合预期,但处理反转IP(如0.16.18.172)时返回错误值,测试输出:

[IpTools.IpObject]::new('172.18.16.0')

ForwardIpAddress ForwardDecimalAddress ReverseIpAddress ReverseDecimalAddress
---------------- --------------------- ---------------- ---------------------
172.18.16.0                    1053356 0.16.18.172                -1408102400

而通过System.Net.IPAddress得到的结果是正确的:

[ipaddress]'172.18.16.0'

AddressFamily      : InterNetwork
ScopeId            :
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv6UniqueLocal  : False
IsIPv4MappedToIPv6 : False
Address            : 1053356
IPAddressToString  : 172.18.16.0

[ipaddress]'0.16.18.172'

AddressFamily      : InterNetwork
ScopeId            :
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv6UniqueLocal  : False
IsIPv4MappedToIPv6 : False
Address            : 2886864896
IPAddressToString  : 0.16.18.172

可以看到反转IP的十进制值差异极大,现有代码无法得到正确的2886864896。

需求

  1. 实现从IP地址0.16.18.172得到十进制地址2886864896的正确转换逻辑,或者了解System.Net.IPAddress的实现方式
  2. 寻求不依赖NuGet包的子网划分解决方案,目前尝试的两个第三方库均无法使用

相关说明及错误尝试

现有对象使用long类型存储地址属性:

public string ForwardIpAddress { get; set; } = string.Empty;
public long ForwardDecimalAddress { get; set; } = 0;
public string ReverseIpAddress { get; set; } = string.Empty;
public long ReverseDecimalAddress { get; set; } = 0;

我尝试了返回long类型的转换代码,但仍得到错误结果,且运行时抛出异常:

public long GetAddress(string ipAddress)
{
    byte[] bytes = IPAddress.Parse(ipAddress).GetAddressBytes();
    if (!BitConverter.IsLittleEndian)
    {
        Array.Reverse(bytes);
    }
    long r = BitConverter.ToInt64(bytes, 0);
    return r;
}

错误信息:

[IpTools.IpObject]::new('172.18.16.0')
MethodInvocationException: Exception calling ".ctor" with "1" argument(s): "Destination array is not long enough to copy all the items in the collection. Check array index and length. (Parameter 'value')"

注:GetAddress()方法需要同时处理正向和反向IP地址,调用逻辑如下:

ForwardIpAddress = ip.ToString();
ForwardDecimalAddress = new Address().GetAddress(ForwardIpAddress);
ReverseIpAddress = reveresed.ToString();
ReverseDecimalAddress = new Address().GetAddress(ReverseIpAddress);

内容的提问来源于stack exchange,提问作者Jeff Patton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:43:14