如何从反转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。
需求
- 实现从IP地址0.16.18.172得到十进制地址2886864896的正确转换逻辑,或者了解
System.Net.IPAddress的实现方式 - 寻求不依赖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
相关产品推荐
相关产品推荐

