美文网首页
python实现网络子网划分

python实现网络子网划分

作者: 讲武德的年轻人 | 来源:发表于2023-03-12 22:43 被阅读0次

不说废话,欢迎留言交流,给我打赏我也不介意嗷!



def str_bin_to_normal(str_bin_ip):
    return '.'.join([str(int('0b'+i,base=2)) for i in [str_bin_ip[0:8], str_bin_ip[8:16], str_bin_ip[16:24], str_bin_ip[24:32]]])


def main():
    choice = input("1.计算子网范围和可用主机数\n2.判断两个ip地址是否属于同一网段\n请选择操作(按1或2,回车):")
    if choice == '1':
        net_lst, ori_mask = input("请输入网段(形式:x.x.x.x/x):").split('/')
        subnet_num = int(input("请输入子网数:"))
        net_str_bin = "".join([bin(x).lstrip('0b').rjust(8,'0') for x in [ int(i) for i in net_lst.split(".")]])   # 二进制字符串ip.
        #"".join([bin(x).lstrip('0b').rjust(8,'0') for x in [ int(i) for i in  net_lst.split(".")]]) 将IP地址转化为二进制字符串
        org_mask_str_bin = '1'*int(ori_mask)+'0'*(32-int(ori_mask))
        # print("用户输入的网络地址:",net_str_bin)
        # print("用户输入的地址掩码:",org_mask_str_bin)

        x = []
        for i in range(0, 32):
            tmp = int(net_str_bin[i]) & int(org_mask_str_bin[i])
            x.append(str(tmp))
        net_base_str_bin = ''.join(x)
        # print("计算出来的网络地址:",net_base_str_bin)

        # 这里计算需要借用几个主机位
        i = 0
        while subnet_num > 2 ** i:
            i += 1
        len_of_subnet = i
        # print("需要借用的主机位数:", len_of_subnet)

        new_mask = '1'*(int(ori_mask)+len_of_subnet) +'0'*(32-int(ori_mask)-len_of_subnet)
        # print("计算得出新子网掩码:",new_mask)

        # 计算子网的起始地址段,其实就是计算出来的网络地址net_base_str_bin,将其转化为正常的ip地址显示
        sub_net_start_bin = net_base_str_bin
        # 计算子网的末尾地址端:计算出来的网络地址的前ori_mask位+借用主机位全1+主机位全0
        sub_net_end_bin = net_base_str_bin[0:int(ori_mask)] + '1'*len_of_subnet + '0'*(32-int(ori_mask)-len_of_subnet)
        # 计算主机可用ip数量
        host_allow_num = (2 ** (32 - int(ori_mask) - len_of_subnet) - 2) * 2 ** len_of_subnet
        if 2**len_of_subnet < subnet_num or host_allow_num <= 0:
            print("该网段不允许划分这么多子网!")
            return

        print('=========================================')
        print("计算出子网开始地址:",str_bin_to_normal(sub_net_start_bin)+'/{}'.format(int(ori_mask)+len_of_subnet))
        print("计算出子网结束地址:", str_bin_to_normal(sub_net_end_bin)+'/{}'.format(int(ori_mask)+len_of_subnet))

        print("可用的主机地址数量:",host_allow_num)

    elif choice == '2':
        ip1, mask1 = input("请输入第一个IP地址(形式:x.x.x.x/x):").split('/')
        ip2, mask2 = input("请输入第二个IP地址(形式:x.x.x.x/x):").split('/')
        net_str_bin_ip1 = "".join([bin(x).lstrip('0b').rjust(8, '0') for x in [int(i) for i in ip1.split(".")]])
        org_mask_str_bin_ip1 = '1' * int(mask1) + '0' * (32 - int(mask1))

        x1 = []
        for i in range(0, 32):
            tmp = int(net_str_bin_ip1[i]) & int(org_mask_str_bin_ip1[i])
            x1.append(str(tmp))
        net_base_str_bin1 = ''.join(x1)

        net_str_bin_ip2 = "".join([bin(x).lstrip('0b').rjust(8, '0') for x in [int(i) for i in ip2.split(".")]])
        org_mask_str_bin_ip2 = '1' * int(mask2) + '0' * (32 - int(mask2))

        x2 = []
        for i in range(0, 32):
            tmp = int(net_str_bin_ip2[i]) & int(org_mask_str_bin_ip2[i])
            x2.append(str(tmp))
        net_base_str_bin2 = ''.join(x2)
        print('=========================================')
        if net_base_str_bin1 == net_base_str_bin2:
            print("他们属于同一个网段:",str_bin_to_normal(net_base_str_bin1)+'/{}'.format(mask1))
        else:
            print("他们不属于同一个网段")
    else:
        print("请输入1或者2")


if __name__ == "__main__":
    main()


相关文章

网友评论

      本文标题:python实现网络子网划分

      本文链接:https://www.haomeiwen.com/subject/pvpqrdtx.html