不說廢話剃浇,歡迎留言交流唇礁,給我打賞我也不介意嗷杖们!
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.計算子網(wǎng)范圍和可用主機(jī)數(shù)\n2.判斷兩個ip地址是否屬于同一網(wǎng)段\n請選擇操作(按1或2萝招,回車):")
if choice == '1':
net_lst, ori_mask = input("請輸入網(wǎng)段(形式:x.x.x.x/x):").split('/')
subnet_num = int(input("請輸入子網(wǎng)數(shù):"))
net_str_bin = "".join([bin(x).lstrip('0b').rjust(8,'0') for x in [ int(i) for i in net_lst.split(".")]]) # 二進(jìn)制字符串ip.
#"".join([bin(x).lstrip('0b').rjust(8,'0') for x in [ int(i) for i in net_lst.split(".")]]) 將IP地址轉(zhuǎn)化為二進(jìn)制字符串
org_mask_str_bin = '1'*int(ori_mask)+'0'*(32-int(ori_mask))
# print("用戶輸入的網(wǎng)絡(luò)地址:",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("計算出來的網(wǎng)絡(luò)地址:",net_base_str_bin)
# 這里計算需要借用幾個主機(jī)位
i = 0
while subnet_num > 2 ** i:
i += 1
len_of_subnet = i
# print("需要借用的主機(jī)位數(shù):", len_of_subnet)
new_mask = '1'*(int(ori_mask)+len_of_subnet) +'0'*(32-int(ori_mask)-len_of_subnet)
# print("計算得出新子網(wǎng)掩碼:",new_mask)
# 計算子網(wǎng)的起始地址段衔瓮,其實(shí)就是計算出來的網(wǎng)絡(luò)地址net_base_str_bin,將其轉(zhuǎn)化為正常的ip地址顯示
sub_net_start_bin = net_base_str_bin
# 計算子網(wǎng)的末尾地址端:計算出來的網(wǎng)絡(luò)地址的前ori_mask位+借用主機(jī)位全1+主機(jī)位全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)
# 計算主機(jī)可用ip數(shù)量
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("該網(wǎng)段不允許劃分這么多子網(wǎng)!")
return
print('=========================================')
print("計算出子網(wǎng)開始地址:",str_bin_to_normal(sub_net_start_bin)+'/{}'.format(int(ori_mask)+len_of_subnet))
print("計算出子網(wǎng)結(jié)束地址:", str_bin_to_normal(sub_net_end_bin)+'/{}'.format(int(ori_mask)+len_of_subnet))
print("可用的主機(jī)地址數(shù)量:",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("他們屬于同一個網(wǎng)段:",str_bin_to_normal(net_base_str_bin1)+'/{}'.format(mask1))
else:
print("他們不屬于同一個網(wǎng)段")
else:
print("請輸入1或者2")
if __name__ == "__main__":
main()