Определите начальный IP-адрес / конечный IP-адрес записанного значения CIDR IPv6 в C#
Я пытаюсь определить начальный IP-адрес и конечный IP-адрес значения CIDR IPv6 Notated в C# (например, 2001:5::/32
). Если я добавлю это значение на этот сайт, я получу:
Start Range: 2001:5:0:0:0:0:0:0
End Range: 2001:5:ffff:ffff:ffff:ffff:ffff:ffff
No. of host: 79228162514264337593543950336
Когда я запускаю его через свой метод, я получаю 32.1.0.5
как для начала, так и для конца. Я думаю, это связано с превращением моих результатов в байтовый массив. Как я могу сделать это лучше, чтобы работать для меня?
private bool GetIPAddressFromCIDR( string ipCIDR, out string startIP, out string endIP )
{
startIP = endIP = "";
try
{
string strAddress = ipCIDR.Substring( 0, ipCIDR.IndexOf( '/' ) );
byte routingBitCount = Byte.Parse( ipCIDR.Substring( ipCIDR.IndexOf( '/' ) + 1 ) );
IPAddress ipAddress = IPAddress.Parse( strAddress );
if( ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6 )
{
BigInteger ip = new BigInteger( ipAddress.GetAddressBytes() );
byte BitSize = 128;
BigInteger mask;
if( routingBitCount == 0 )
{
mask = 0;
}
else
{
mask = unchecked( ~( ( 1 << routingBitCount ) - 1 ) );
}
BigInteger start = ip & mask;
BigInteger end = ip | ~mask;
startIP = new IPAddress( start.ToByteArray() ).ToString();
endIP = new IPAddress( end.ToByteArray() ).ToString();
}
else
{
byte BitSize = 32;
uint address = BitConverter.ToUInt32( ipAddress.GetAddressBytes(), 0 );
uint mask = routingBitCount == 0 ? 0 : unchecked( ~( ( ( uint ) 1 << ( BitSize - routingBitCount ) ) - 1 ) );
uint start = address & mask;
uint end = start | ~mask;
startIP = new IPAddress( start ).ToString();
endIP = new IPAddress( end ).ToString();
}
return true;
}
catch( Exception ex )
{
return false;
}
}
PS. Нет библиотек, пожалуйста. Я хочу, чтобы этот код работал