我正在尝试用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),发布于 2014-02-28 20:00:51
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看起来是在做你想做的事。
https://stackoverflow.com/questions/22092284
复制相似问题