C# 确定用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 = "";

我正在尝试确定以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 = "";
    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;
    }
}