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


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()
网友评论