1、判斷IP同網段方法,兩個IP分別與子網掩碼相與,所得結果相同即為同網段IP
2、子網掩碼規則:轉為二進制后前部分全1,后半部分全0,掩碼不可全1或全0,不可有0位於1前
##將IP地址轉為二進制
def ipToBinary(ip):
'''ip address transformat into binary
Argv:
ip: ip address
Return:
binary
'''
ip_num = ip.split('.')
x = 0
##IP地址是點分十進制,例如:192.168.1.33,共32bit
##第1節(192)向前移24位,第2節(168)向前移16位
##第3節(1)向遷移8位,第4節(33)不動
##然后進行或運算,得出數據
for i in range(len(ip_num)):
num = int(ip_num[i]) << (24 - i * 8)
x = x | num
brnary = str(bin(x).replace('0b', ''))
return brnary
##將子網掩碼轉為二進制
def maskToBinary(mask):
'''netmask change, example: 24 or 255.255.255.0 change binary
Argv:
mask: netmask, example:24 or 255.255.255.0
Return:
binary
'''
mask_list = str(mask).split('.')
##子網掩碼有兩種表現形式,例如:/24或255.255.255.0
if len(mask_list) == 1:
##生成一個32個元素均是0的列表
binary32 = []
for i in range(32):
binary32.append('0')
##多少位子網掩碼就是連續多少個1
for i in range(int(mask)):
binary32[i] = '1'
binary = ''.join(binary32)
##輸入的子網掩碼是255.255.255.0這種點分十進制格式
elif len(mask_list) == 4:
binary = ipToBinary(mask)
return binary
##判斷IP地址是否屬於這個網段
def ipInSubnet(ip, subnet):
'''
Argv:
ip: ip address,example:1.1.1.1
subnet: subnet,example:1.1.1.0/24,or 1.1.1.0/255.255.255.0
Return:
False or True
'''
subnet_list = subnet.split('/')
networt_add = subnet_list[0]
network_mask = subnet_list[1]
##原來的得出的二進制數據類型是str,轉換數據類型
ip_num = int(ipToBinary(ip), 2)
subnet_num = int(ipToBinary(networt_add), 2)
mask_bin = int(maskToBinary(network_mask), 2)
##IP和掩碼與運算后比較
if (ip_num & mask_bin) == (subnet_num & mask_bin):
return True
else:
return False