将CIDR表示法转换为IP范围

时间:2015-08-15 18:51:07

标签: c# .net ip-address cidr

我们正在使用GeoLite2数据库来实现 IP - >国家/地区查找。出于性能原因,我们要导入CSV并将其转换为我们自己的格式。

CSV表示如下:

5.39.40.96/27,3017382,3017382,,0,0
5.39.40.128/28,3017382,3017382,,0,0
5.39.40.144/28,2635167,3017382,,0,0
5.39.40.160/27,3017382,3017382,,0,0
5.39.40.192/26,3017382,3017382,,0,0
5.39.41.0/25,3017382,3017382,,0,0
5.39.41.128/26,3017382,3017382,,0,0
5.39.41.192/26,2635167,3017382,,0,0
5.39.42.0/24,3017382,3017382,,0,0
5.39.43.0/25,3017382,3017382,,0,0

因此,我们需要将CIDR表示法(示例:5.39.40.96/27 )转换为IP地址范围。 (从IP到IP)

如何在C#中完成?

注意:这不是this question的重复,因为我询问的是C#实现,而不是Java。

3 个答案:

答案 0 :(得分:8)

这是处理它的一种方法,不使用任何库函数来明确发生了什么,并在以后有人需要用其他语言实现它时提供帮助。

代码首先将CIDR转换为32位数字,然后创建掩码以确定起始地址,使用掩码的反转来确定结束地址,然后转换回CIDR格式。

请注意,没有错误检测,因此输入必须是a.b.c.d / m格式。

IP地址的转换只是使用位移的大端格式(AABBCCDD)的四个八位字节的简单串联。

掩码告知最高有效位中有多少位是固定的,这意味着32是单个IP​​范围,0是整个IP范围。因此,我们可以设置所有位设置的掩码,并使用32-maskbits向左移动以确定实际掩码。

如果我们将maskbits位设置为零,我们得到范围的开头,所以我们和IP一起使用maskbits。如果我们将这些位设置为1,我们得到范围的结束,所以我们将使用否定的掩码位进行OR运算。

以CIDR格式打印IP地址再次简单:只需将32位值拆分为八位字节,然后用点分隔它们。

using System;

namespace CSTests
{
    class Program
    {
        static string toip(uint ip)
        {
            return String.Format("{0}.{1}.{2}.{3}", ip >> 24, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
        }

        static void Main(string[] args)
        {
            string IP = "5.39.40.96/27";
            string[] parts = IP.Split('.', '/');

            uint ipnum = (Convert.ToUInt32(parts[0]) << 24) |
                (Convert.ToUInt32(parts[1]) << 16) |
                (Convert.ToUInt32(parts[2]) << 8) |
                Convert.ToUInt32(parts[3]);

            int maskbits = Convert.ToInt32(parts[4]);
            uint mask = 0xffffffff;
            mask <<= (32 - maskbits);

            uint ipstart = ipnum & mask;
            uint ipend = ipnum | (mask ^ 0xffffffff);

            Console.WriteLine(toip(ipstart) + " - " + toip(ipend));
        }
    }
}

输出:

  

5.39.40.96 - 5.39.40.127

答案 1 :(得分:0)

这里你的答案不正确 网络ID应为:5.39.40.64和 广播ID应为:5.39.40.95和 可用IP:5.39.40.65至5.39.40.94

我也在Advance Subnet Calculator中计算,你可以在图片中看到结果 enter image description here

答案 2 :(得分:0)

Sami Kuhmonen,这是非常不错的代码,并经过认真简化。我注意到它返回了网络ID和广播。但是,对于那些希望返回可用地址空间的人。只需在起始IP上添加一个,然后从终止IP减去一个即可。

toip(ipstart + 1) + " - " + toip(ipend -1);