2014-02-28 175 views
0

我想在Python中编写一个IP地址程序。但是,当我使用小于7的掩码来获取网络ID时,我会得到奇怪的数字。例如,对于IP地址164.36.32.32和子网掩码6,我得到43.0.0.0。请注意,netmask包含二进制的整个IP地址。二进制字符串

if mask<=8: 
print int(netmask[0:mask],2),".0.0.0" 
elif mask>8 and mask<=16: 
print int(netmask[0:8],2),".",int(netmask[8:mask],2) 
elif mask>16 and mask<=24: 
print int(netmask[0:8],2),".",int(netmask[8:16],2),".",int(netmask[16:mask],2) 
elif mask>24 and mask<=32: 
print  int(netmask[0:8],2),".",int(netmask[8:16],2),".",int(netmask[16:24],2),".",int(netmask[24:mask],2), 
+0

你可能想看看[IPy](https://pypi.python.org/pypi/IPy/)。它会做你想要的,然后再做一些 – RedBaron

回答

0

Python的标准库包含ipaddress模块,该模块将对IP地址执行最常见的操作。从你的代码看来,你的IP地址的“二进制”表示实际上是一个由1和0组成的字符串。这不仅会比使用整数的效率低得多,而且你将使用比你需要更多的内存。特别是http://docs.python.org/dev/library/ipaddress#ipaddress.IPv4Interface.network的信息可能会有所帮助。因为这似乎是一个学习练习,不过,我们可以看看使用你当前的表示。

我假设你没有在第二种情况下追加“.0.0”而在第三种情况下追加了“.0”。

无论使用字符串还是整数,执行屏蔽操作的最佳方法是首先处理位,然后将位形式转换为您的首选表示形式。定义一个将32位字符串转换为点划线符号的函数相对容易。通过仅保留由网络前缀指示的位来构建掩蔽地址的功能也并不困难。

address = "11110000110011001010101010100001" 
assert len(address) == 32 

def dotted_quad(address): 
    return ".".join(str(int(address[i*8:(i+1)*8], 2)) for i in range(4)) 

def net_address(address, prefix): 
    return dotted_quad(address[:prefix]+"0"*(32-prefix)) 

print dotted_quad(address) 

for prefix in range(32): 
    print net_address(address, prefix) 

这将打印

240.204.170.161 
0.0.0.0 
128.0.0.0 
192.0.0.0 
224.0.0.0 
240.0.0.0 
240.0.0.0 
240.0.0.0 
240.0.0.0 
240.0.0.0 
240.128.0.0 
240.192.0.0 
240.192.0.0 
240.192.0.0 
240.200.0.0 
240.204.0.0 
240.204.0.0 
240.204.0.0 
240.204.128.0 
240.204.128.0 
240.204.160.0 
240.204.160.0 
240.204.168.0 
240.204.168.0 
240.204.170.0 
240.204.170.0 
240.204.170.128 
240.204.170.128 
240.204.170.160 
240.204.170.160 
240.204.170.160 
240.204.170.160 
240.204.170.160 

这似乎做你想要什么。