从前缀长度python 3.x中获取十进制网络掩码



我之所以创建这段代码,是因为我找不到任何能满足我需求的函数。

如果你能减少它会更好。

只需输入从1到32的前缀长度,您就会得到十进制掩码。这段代码帮助我为cisco编写脚本。

import math
#Netmask octets
octet1 = [0,0,0,0,0,0,0,0]
octet2 = [0,0,0,0,0,0,0,0]
octet3 = [0,0,0,0,0,0,0,0]
octet4 = [0,0,0,0,0,0,0,0]
#POW list
pow_list = [7,6,5,4,3,2,1,0]
#Introduce prefix lenght
mask = int(input("Introduce the prefix lenght: "))
#According to the number of bits we will change the array elements from 0 to 1
while mask >= 25 and mask <= 32:
octet4[mask-25] = 1
mask -= 1
while mask >= 17 and mask <= 24:
octet3[mask-17] = 1
mask -= 1
while mask >= 9 and mask <= 16:
octet2[mask-9] = 1
mask -= 1
while mask >= 1 and mask <= 8:
octet1[mask-1] = 1
mask -= 1
#Obtain the number of ones
ones1 = octet1.count(1)
ones2 = octet2.count(1)
ones3 = octet3.count(1)
ones4 = octet4.count(1)
#Summary and reuslt of each octet.
sum1 = 0
for i in range(0,ones1):
sum1 = sum1 + math.pow(2,pow_list[i])
sum1 = int(sum1)
sum2 = 0
for i in range(0,ones2):
sum2 = sum2 + math.pow(2,pow_list[i])
sum2 = int(sum2)
sum3 = 0
for i in range(0,ones3):
sum3 = sum3 + math.pow(2,pow_list[i])
sum3 = int(sum3)
sum4 = 0
for i in range(0,ones4):
sum4 = sum4 + math.pow(2,pow_list[i])
sum4 = int(sum4)
#Join the results with a "."
decimal_netmask = str(sum1) + "." + str(sum2) + "." + str(sum3) + "." + str(sum4)
#Result
print("Decimal netmask is: "+ decimal_netmask)

结果:介绍前缀长度:23十进制网络掩码为:255.255.254.0

您可以通过使用以下公式将总掩码值计算为整数来简化代码:

mask = 2**32 - 2**(32-prefix_length)

然后,您可以计算掩码的4个8位部分(通过移位和掩码(,将结果附加到列表中,然后最后将列表中的每个元素与.:连接起来

def decimal_netmask(prefix_length):
mask = 2**32 - 2**(32-prefix_length)
octets = []
for _ in range(4):
octets.append(str(mask & 255))
mask >>= 8
return '.'.join(reversed(octets))
for pl in range(33):
print(f'{pl:3d}t{decimal_netmask(pl)}')

输出:

0     0.0.0.0
1     128.0.0.0
2     192.0.0.0
3     224.0.0.0
4     240.0.0.0
5     248.0.0.0
6     252.0.0.0
7     254.0.0.0
8     255.0.0.0
9     255.128.0.0
10     255.192.0.0
11     255.224.0.0
12     255.240.0.0
13     255.248.0.0
14     255.252.0.0
15     255.254.0.0
16     255.255.0.0
17     255.255.128.0
18     255.255.192.0
19     255.255.224.0
20     255.255.240.0
21     255.255.248.0
22     255.255.252.0
23     255.255.254.0
24     255.255.255.0
25     255.255.255.128
26     255.255.255.192
27     255.255.255.224
28     255.255.255.240
29     255.255.255.248
30     255.255.255.252
31     255.255.255.254
32     255.255.255.255

由于您可能要做的不仅仅是将CIDR转换为网络掩码,我建议您查看内置库ipaddress

from ipaddress import ip_network
cidr = input("Introduce the prefix length: ")
decimal_netmask = str(ip_network(f'0.0.0.0/{cidr}').netmask)

最新更新