二进制到字符串

时间:2014-02-28 10:19:27

标签: python string binary

我正在尝试用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),

1 个答案:

答案 0 :(得分: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

似乎正在做你想做的事。