天天看點

python 判斷兩個IP同網段

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