请教一下ip掩码换算
经常能看到论坛有各种所谓电信、网通ip表之类的东西,也不是说不好,反正不是自己动手的信任度还是比较低。这段时间刚好要琢磨境外ip路由的问题,这会想偷懒都不行了,因为论坛里的不是电信就是网通,反正没有另外列出境外ip.............
抓了一个纯真ip库,导出的格式是类似这样
----------------------------------------------------------------------
24.42.64.0 24.42.98.255 加拿大
24.42.99.0 24.42.99.255 加拿大 渥太华
24.42.100.0 24.42.158.255 加拿大
24.42.159.0 24.42.159.255 加拿大 安省士嘉堡
24.42.160.0 24.43.4.255 加拿大
----------------------------------------------------------------------
于是想偷懒写个程序直接“勾兑”出来,问题就来了....要怎样才能换算成掩码呢?
需要一个公式,已知ip段头尾,怎计算出这些掩码?
P.S:不用告诉我怎算,我知道怎算,问题是这些ip段不规则。 http://bbs.routerclub.com/viewthread.php?tid=9345&highlight=%D1%DA%C2%EB
24.42.64.0 24.42.98.255 加拿大
24.42.99.0 24.42.99.255 加拿大 渥太华
24.42.100.0 24.42.158.255 加拿大
24.42.159.0 24.42.159.255 加拿大 安省士嘉堡
24.42.160.0 24.43.4.255 加拿大
晕他们是连续的
24.42.64.0-24.43.4.255
24.42.64.0/19
24.43.0.0/22
24.43.4.0/24
[ 本帖最后由 lsq726 于 2007-2-11 09:26 编辑 ] 按行来算的话没办法计算掩码,不符合规则
ros不是自动就将符合要求的地址长度进行转化了吗 我知道按照那个文本的行来换算的话是肯定没可能的,这也正是我需要求助的地方,我所期望的,当然就是如下的例子....例如把24.42.64.0-24.43.4.255换算成24.42.64.0/19,24.43.0.0/22,24.43.4.0/24。这个要是做好,以后编辑ip路由表就方便很多了。
原帖由 lsq726 于 2007-2-11 09:21 发表
24.42.64.0-24.43.4.255
24.42.64.0/19
24.43.0.0/22
24.43.4.0/24 找我啊,哈哈,我11月的时候就从APNIC那里弄了所有的电信IP出来了 1、计算出有多少个IP
2、根据数量计算出掩码! 原帖由 专卖精品 于 2007-2-11 15:49 发表
找我啊,哈哈,我11月的时候就从APNIC那里弄了所有的电信IP出来了
关键是,我现在要捣弄的是境外ip..........我知道怎算,用手算我可以算出来,问题是,不知道应该怎转换成算式让程序算。 原帖由 seignior 于 2007-2-11 16:14 发表
关键是,我现在要捣弄的是境外ip..........我知道怎算,用手算我可以算出来,问题是,不知道应该怎转换成算式让程序算。
用EXCEL啊,回头谈,呵呵 我自己能写些小程序,但却不懂excel+_+"
之前用程序砍电信网通铁通ip,30万行原始数据,砍了快10个小时才把电信网通铁通ip删除完........excel这些vbs脚本就算了吧。 我上次用的方法是:
1、先把IP分开,比如192.168.0.1分成192 168 0 1,然后用后面的IP减去前面的IP,分别得到4个数值,比如192.168.0.0-192.168.255.255,计算后可以得到0 0 255 255这样4个值,然后每个数值加1,得到1 1 256 256,最后把所有的数值相乘,得到的就是一共的IP数量,这个看起来复杂,其实在EXCEL里面编好公式就行了,还是很简单的
2、得到的数值(比如上面是得到65536),进行对数运算(LN65536/LN2),得到16,最后用32-16=16,这个最后的16就是掩码
关键是第一部的数值分离要用点技巧,后面的计算就直接可以用EXCEL的公式完成,还是很简单的,哈哈,如果还是没有搞定,你把表给我,我帮你弄,只要数量不是太多,半小时是肯定可以了! 大体思路如下,可能局部不太严谨,年底太忙,时间不太够,哈哈,多谅解
if smalladd-bigadd>0 then swap(smalladd,bigadd)
do while bigadd-smalladd=0
smallnetwork=smalladd
smallallowadd = f(smallnetwork)//通过循环找到小地址的本网段所允许的最大网段(或简单换成二进制从右边数0的个数也行)
if bigadd>smallallownetwork then //最大的值还不够大,此时需要超网计算
print smallallownetwork //这个网段已经达到最大,因此可以输出了
smalladd = newbing(smalladd,smallallownetwork) //通过smallallownetwork可以计算出下一个启始网段
else //此时需要进行子网计算,
smallallownetwork = g(smallnetwork)//通过循环找到小地址的小一级子网所允许的最大网段
print smallallownetwork //值合适则输出
smalladd = newsmall(smalladd) //通过smallallownetwork可以计算出下一个启始网段
end if
loop
[ 本帖最后由 parphy 于 2007-2-12 08:47 编辑 ] 补充:
前提:是地址必须连续
难点:无非就是有些段是超网(这里的超网概念不是严格意义上的,而是指超过最大子网范围的网段),有些段是子网,这地方容易走弯路(前面楼上给的提示就是)
方法比较笨,但思路是可行的,多用二进制会大大提高计算效率,1000行,1分钟内应该可以计算完
举个简单例子说明思路:
24.42.61.0-24.43.4.255循环序号得到网段(可输出)广播地址(可输出)下一网段024.42.61.0/2424.42.61.255 24.42.62.0/23124.42.62.0/2324.42.63.25524.42.64.0/18224.42.64.0/1824.62.127.25524.42.128.0/17324.42.128.0/1724.62.255.25524.43.0.0/16 424.43.0.0/2224.63.3.25524.43.4.0/22524.43.4.0/2424.43.4.255bigadd-smalladd=0,循环结束为什么不用减法计算?
1、如果有退位,对数组来说算法反而增加麻烦
2、起始点如果不为0,则差值固定的情况下,不同的匹配有不同的结果,如果再算匹配,则本思路的整体思路其实就可以完全等同匹配算法,结果就是,绕了一大圈又回来了,搞不好,还可能需要重新合并得到的网段数组(虽然不合并也可以用)
3、本算法可以应付任意连续IP地址,属于非常直接易看懂的方式,得到的网段数也最精简。
[ 本帖最后由 parphy 于 2007-2-12 09:16 编辑 ]
页:
[1]