一个python写的子网划分器

一个python写的子网划分器



[Copy to clipboard] [ - ]
CODE:
#!usr/bin/python
# -*- coding: cp936 -*-
#filename subnet.py
#Write by Huang Yong. 2006-11-24
'''子网划分器,输入网络地址,子网掩码,cidr掩码,输出划分好的子网'''

import sys
def Ip2n(ipadress):
    li=ipadress.split('.')       
    if len(li)!=4:
        return 0
    li=[int(k) for k in li]
    for i in li:
        if (i<0) or (i>255):
            return 0
    ipnum=(li[0]<<24)|(li[1]<<16)|(li[2]<<8)|li[3]   
    return ipnum

def num2Ip(intip):
    li=[str(intip>>24),str((intip>>16)&255),str((intip>>8)&255),str(intip&255)]
    return '.'.join(li)
   
def lenofmask(netmask):
    i=32
    k=(255<<24)|(255<<16)|(255<<8)|255
    j=k
    while netmask!=(j&k) and i>=8:
        k=k<<1
        i-=1
    if i<8:return -1
    return i
   
def subnet(subnet_ip,netmask,cidrMask):
    subnet=Ip2n(subnet_ip)
    netmask=Ip2n(netmask)
    cidrmask=Ip2n(cidrMask)
    li=[]
    i=32-lenofmask(cidrmask)
    subnet=subnet>>i
    netmask=netmask>>i
    cidrmask=cidrmask>>i
    for ip in range(subnet,(subnet|(netmask^cidrmask))+1):
        li.append(ip<<i)
    ip_li=[num2Ip(ip) for ip in li]
    return ip_li

if __name__=='__main__':
    netip=sys.argv[1]
    netmask=sys.argv[2]
    cidrmask=sys.argv[3]
    iplist=subnet(netip,netmask,cidrmask)
    lenmask=lenofmask(Ip2n(netmask))
    lencidr=lenofmask(Ip2n(cidrmask))
    print "\n网络",netip+'/'+str(lenmask),"可划分为如下",len(iplist),"个子网:\n"
    for s in iplist:
        print s+'/'+str(lencidr)

请大家多提意见和建议,谢谢,程序输入 subnet.py  网络IP 子网掩码 划分所需的子网掩码
请问这句是因为Python是强变量
所以即使获得字符型数字也需要int转换么
li=[int(k) for k in li]
是啊,应该说python是强类型的
这样不知效率如何(未测试)

[Copy to clipboard] [ - ]
CODE:
def Ip2n(ipadress):
    li=ipadress.split('.')      
    if len(li)!=4:
        return 0
    return reduce(lambda a,b:(a<<8)+b,[int(i) for i in li])

最后一句能解释一下吗,没大看懂,不好意思
明白了,是函数式编程,我想效率肯定会低些,不过看起来要酷点^_^.