# -*- coding: UTF-8 -*-
import sys
ip = input("输入网络号")
mask = input("输入网络位")
need = input("输入子网数量")
'''按字节切割网络号并转换整型最后验证'''
temp2 = ip.split('.')
if len(temp2) != 4:
print("网络号格式不合法!需为a.b.c.d格式!")
sys.exit()
ip10 = [0]*4 #初始化4个为[0]列表
for i in range(4): #按序把每一字节填进ip10列表内转为整形
ip10[i] = int(temp2[i])
if (ip10[i] < 0) or (ip10[i] > 255):
print("网络号取值不合法!网络号每一字节取值需在[0,255]区间")
sys.exit()
'''验证掩码、子网数量并转为整数型'''
Mask = int(mask) #掩码
subnetNumber = int(need) #子网数量
if Mask < 0 or Mask > 29:
print("掩码应为[0,29]之间!!")
sys.exit()
if subnetNumber < 2:
print("子网数量需要至少为2!")
sys.exit()
'''网络号转换为二进制'''
ip2=[0]*32 #初始化32个为[0]列表存放每一位IP地址并转换为二进制
k=31
for i in range(3,-1,-1): #每次对ip10的一个成员进行转换,进行4次
for j in range(8):
ip2[k] = ip10[i] >> j & 1 #按位进行判断ip10值,并将值赋给ip2;ip10/2^j==ip10(二进制后)第8-j个位的取值
k-=1
if (1 << (32 - Mask))<=subnetNumber: #子网数不可超过主机数量
print("需求子网数应 小于最大主机数量!最大主机数量为",1 << (32 - Mask))
sys.exit()
'''计算应当划分的子网数量和每个子网的最大主机数量'''
realSubnetNumber = subnetNumber-1 #将子网数目-1
power = 1 #子网号的位数
while (realSubnetNumber >> 1) != 0: #算出二进制表示子网数的位数
realSubnetNumber = realSubnetNumber >> 1
power += 1
realSubnetNumber = 1 << power
subnetMask = Mask+power #子网掩码=类掩码位数加子网号位数
maxHost = (1 << (32-subnetMask))-2 #每个子网的最大主机数量
if maxHost <= 0:
print("需求子网需求超过阈值!请适当减小子网需求量,建议需求子网数降为",(1 << (power-1)),"之内")
sys.exit()
subnetMask_10 = [0] * 4 #初始化为4个[0]的列表,存放子网掩码10进制
flag = 0 #flag0标记每字节的位从左向右0的位置
subnetMask_eg = subnetMask
for i in range(4):
while (subnetMask_eg!= 0): #剩下当子网掩码数不为0时
subnetMask_10[i] += (1 << (7 - flag)) #2^(7 - flag),按位数取对应值
flag += 1
subnetMask_eg -= 1
if subnetMask_10[i] == 255:
break
flag = 0
'''分配ip'''
FIp = [[0 for col in range(4)] for row in range(realSubnetNumber)] #第一个ip 子网数个[0,0,0,0]的表
EIp = [[0 for col in range(4)] for row in range(realSubnetNumber)] #最后一个ip
ip2_s = [[0 for col in range(32)] for row in range(realSubnetNumber)] #子网划分二进制 子网数个[0,0....(32个0)]的表
z = 0 #计算子网规划二进制
q = 0 #递增辅助算子网规划二进制
for i in range(realSubnetNumber):
z = int(q)
'''设置子网号'''
for j in range(power): #子网号,递增,从低位赋值
ip2[subnetMask - j - 1] = i >> j &1 #i/2^j &1
#验证print(ip2[subnetMask - j - 1])
'''设置第一个ip'''
for j in range(Mask + power, 32): #ip2主机成员全取0
ip2[j]=0
for j in range(4): #计算每一段IP地址,十进制
t=0 #计算数组对应的值
for k in range(8): #k 0-7
t += ip2[(j << 3) + k] << (7 - k) #t=t+ip2[(j*8)+k]*2^(7-k) 根据位和该位取值进行赋值
FIp[i][j] = t #网络地址
'''设置最后一个ip'''
for j in range(Mask + power,32): #ip2主机成员全取1
ip2[j]=1
for j in range(4):
t=0
for k in range(8):
t += ip2[(j << 3) + k] << (7 - k) #t=t+ip2[(j*8)+k]*2^(7-k)
EIp[i][j] = t #广播地址
'''设置第i+1个二进制子网划分'''
for k in range(0, Mask): #0---M位为1
ip2_s[i][k] = 1
for k in range(subnetMask-1, Mask-1, -1): #subnetMask-1--M位变化
ip2_s[i][k] = z % 2
z = z // 2
#ip2_s[i][k]=ip2[k]
for k in range(subnetMask, 32): #主机号全取0
ip2_s[i][k] = 0
q += 1
'''输出'''
mylog = open('网络划分存档.txt', mode='a', encoding='UTF-8') #模式a追加 UTF-8编码
def printme( ): #打印函数
a=185
while (a):
print("*",end="", file=mylog)
a-=1
def printme1( ): #打印函数
a=185
while (a):
print("*",end="")
a-=1
printme1()
print("")
print("*根IP地址为:", ip, "\n" + "*掩码位数为:", Mask, "\n" + "*子网掩码位数为:", subnetMask)
print("*需求子网数量为:", subnetNumber, "\n" + "*实际划分的子网数量为:", realSubnetNumber)
print("*每个子网最大的主机数量为:", maxHost)
printme1()
print("")
str6 = ""
print('{:^20}{:^20}{:^20}{:^20}{:^22}{:^22}{:^34}'.format("子网序号", "第一个可用IP地址", "最后一个可用IP地址", "子网掩码", "网络地址", "广播地址", "子网划分二进制" ))
for i in range(realSubnetNumber):
str0 = str(i + 1)
str1 = str(FIp[i][0]) + "." + str(FIp[i][1]) + "." + str(FIp[i][2]) + "." + str(FIp[i][3] + 1)
str2 = str(EIp[i][0]) + "." + str(EIp[i][1]) + "." + str(EIp[i][2]) + "." + str(EIp[i][3] - 1)
str3 = str(subnetMask_10[0]) + "." + str(subnetMask_10[1]) + "." + str(subnetMask_10[2]) + "." + str(
subnetMask_10[3])
str4 = str(FIp[i][0]) + "." + str(FIp[i][1]) + "." + str(FIp[i][2]) + "." + str(FIp[i][3])
str5 = str(EIp[i][0]) + "." + str(EIp[i][1]) + "." + str(EIp[i][2]) + "." + str(EIp[i][3])
for k in range(31):
str6 = str6 + str(ip2_s[i][k])
if (k + 1) % 8 == 0:
str6 = str6 + "."
print("")
print('{:^22}{:^24}{:^27}{:^22}{:^24}{:^24}{:^37}'.format(str0, str1, str2, str3, str4, str5, str6))
str6 = ""
printme1()
mylog.close()
print("\n文件成功保存于 ")
子网划分
最新推荐文章于 2023-07-13 09:48:27 发布