C# 确定用C表示的IPv6 CIDR值的起始IP/结束IP地址#
我正在尝试确定以C#表示的IPv6 CIDR值的起始IP地址和结束IP地址(例如,C# 确定用C表示的IPv6 CIDR值的起始IP/结束IP地址#,c#,ipv6,biginteger,cidr,C#,Ipv6,Biginteger,Cidr,我正在尝试确定以C#表示的IPv6 CIDR值的起始IP地址和结束IP地址(例如,2001:5::/32)。如果我将该值输入,我得到: 当我通过我的方法运行它时,我得到了开始和结束的32.1.0.5。我猜这与将结果转换为字节数组有关。我怎样才能让它更好地为我工作 private bool GetIPAddressFromCIDR( string ipCIDR, out string startIP, out string endIP ) { startIP = endIP = "";
2001:5::/32
)。如果我将该值输入,我得到:
当我通过我的方法运行它时,我得到了开始和结束的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;
}
}
private bool getipaddress fromCIDR(字符串ipCIDR、输出字符串startIP、输出字符串endIP)
{
startIP=endIP=“”;
尝试
{
string strAddress=ipCIDR.Substring(0,ipCIDR.IndexOf('/');
byte routingBitCount=byte.Parse(ipCIDR.Substring(ipCIDR.IndexOf('/')+1));
IPAddress IPAddress=IPAddress.Parse(StradAddress);
if(ipAddress.AddressFamily==System.Net.Sockets.AddressFamily.InterNetworkV6)
{
BigInteger ip=新的BigInteger(ipAddress.GetAddressBytes());
字节位大小=128;
大整数掩码;
如果(routingBitCount==0)
{
掩码=0;
}
其他的
{
掩码=未选中(~(1)如果您使用按位和的CIDR
一个数和(128-CIDR)
零个数,则以起始地址结束。若要获取最后一个地址,请使用按位或的CIDR
零个数和(128-CIDR)
number of One.无论如何,你可以用我的代码告诉我你在说什么,因为我认为这就是我在做的事情?转换成字节数组的数字给了我一个IPv4号码。问题之一(但不是唯一的问题)是BigInteger以字节数组表示的方式。首先,它始终是小尾数,但ip地址GetAddressBytes以大尾数顺序返回字节(因此需要反转)。然后,BigInteger是有符号类型,您可以在此处读取它对字节表示的影响-。然后,BigInteger不是固定大小的类型(与int不同,例如int总是32位)-这也带来了它自己的问题。所有这些都使得BigInteger不是您任务的最佳候选。有没有办法将字节数组拆分为两个ulong值?我知道如果我可以得到两个64位值,我可以做正确的数学运算。我只是不确定如何拆分它。如果您使用按位和与CIDR
的位数和(128-CIDR)
零的数量,然后以起始地址结束。要获取最后一个地址,请使用按位的或与CIDR
零的数量和(128-CIDR)
number of One.无论如何,你可以用我的代码告诉我你在说什么,因为我认为这就是我在做的事情?转换成字节数组的数字给了我一个IPv4号码。问题之一(但不是唯一的问题)是BigInteger以字节数组表示的方式。首先,它始终是小尾数,但ip地址GetAddressBytes以大尾数顺序返回字节(因此需要反转)。然后,BigInteger是有符号类型,您可以在此处读取它对字节表示的影响-。然后,BigInteger不是固定大小的类型(与int不同,例如int总是32位)-这也带来了它自己的问题。所有这些都使BigInteger不是您任务的最佳候选。有没有办法将字节数组拆分为两个ulong值?我知道如果我可以得到两个64位值,我可以正确计算。我只是不确定如何拆分它。
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;
}
}