2021-10-25 判斷兩個ip是否在同一網(wǎng)段。

#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
@Project : MyTest_py3
@File    : ipsunetroute.py
@Author  : yum
@Date    : 2021/8/20 16:48
   判斷兩個ip是否在同一網(wǎng)段。
"""


class ipSunetRoute(object):
    ##將IP地址轉(zhuǎn)為二進制
    def ipToBinary(self, 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節(jié)(192)向前移24位,第2節(jié)(168)向前移16位
        ##第3節(jié)(1)向遷移8位,第4節(jié)(33)不動
        ##然后進行或運算,得出數(shù)據(jù)
        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

    ##將子網(wǎng)掩碼轉(zhuǎn)為二進制
    def maskToBinary(self, 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('.')

        ##子網(wǎng)掩碼有兩種表現(xiàn)形式,例如:/24或255.255.255.0
        if len(mask_list) == 1:
            ##生成一個32個元素均是0的列表
            binary32 = []
            for i in range(32):
                binary32.append('0')

            ##多少位子網(wǎng)掩碼就是連續(xù)多少個1
            for i in range(int(mask)):
                binary32[i] = '1'

            binary = ''.join(binary32)

        ##輸入的子網(wǎng)掩碼是255.255.255.0這種點分十進制格式
        elif len(mask_list) == 4:
            binary = self.ipToBinary(mask)

        return binary

    ##判斷IP地址是否屬于這個網(wǎng)段
    def ipInSubnet(self, 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]

        ##原來的得出的二進制數(shù)據(jù)類型是str,轉(zhuǎn)換數(shù)據(jù)類型
        ip_num = int(self.ipToBinary(ip), 2)
        subnet_num = int(self.ipToBinary(networt_add), 2)
        mask_bin = int(self.maskToBinary(network_mask), 2)

        ##IP和掩碼與運算后比較
        if (ip_num & mask_bin) == (subnet_num & mask_bin):
            print('True')
            return True
        else:
            print('False')
            return False


if __name__ == "__main__":
    ipr = ipSunetRoute()
    ipr.ipInSubnet('11.22.163.215', '11.24.163.215/20')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容