首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从前缀长度python3.x获得十进制网络掩码

从前缀长度python3.x获得十进制网络掩码
EN

Stack Overflow用户
提问于 2022-10-21 06:15:45
回答 2查看 30关注 0票数 0

我创建这段代码是因为我找不到任何功能来完成我的需求。

如果你能减少它会更好。

只需输入de前缀长度从1到32,您将得到十进制掩码。这段代码帮助我完成了思科的脚本。

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2022-10-21 12:32:08

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

代码语言:javascript
复制
from ipaddress import ip_network
cidr = input("Introduce the prefix length: ")
decimal_netmask = str(ip_network(f'0.0.0.0/{cidr}').netmask)
票数 1
EN

Stack Overflow用户

发布于 2022-10-21 08:03:43

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

代码语言:javascript
复制
mask = 2**32 - 2**(32-prefix_length)

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

代码语言:javascript
复制
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)}')

输出:

代码语言:javascript
复制
  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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74149456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档