子网划分

# -*- 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的一个成员进行转换,进行4for 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      子网数个[0000]的表
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)]    #子网划分二进制 子网数个[00....320)]的表
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文件成功保存于 ")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老尚嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值