zoukankan      html  css  js  c++  java
  • Python模块学习

    简介

      在IP地址规划中,涉及到计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等,即便是专业的网络人员也要进行繁琐的计算,而IPy模块提供了专门针对IPV4地址与IPV6地址的类与工具,可以帮助实现计算子网掩码、网络掩码、广播地址、子网数、IP类型等。

    # 安装ipy
    pip3 install ipy
    

    基本使用

      ipy模块内部主要主要提供了IP类、IPint类,IPset类,我们常用的就是IP类,这个类可以接受几乎任何格式的IP地址和网段。

    常用方法

    version():获取IP地址的版本

    >>> from IPy import IP
    >>> IP('10.0.0.1').version()
    4
    >>> IP('10.0.0.0/24').version()
    4
    >>> IP('::1').version()
    6
    
    # 4 表示 IPv4, 6 表示 IPv6
    

    len():获取子网IP地址的个数

    >>> from IPy import IP
    >>> ip = IP('10.0.0.0/27')
    >>> ip.len()
    32
    
    # 纯的IP个数,我们需要排除网络地址和广播地址,所以可用地址是30个
    

    iptpe():获取IP地址的类型

    >>> from IPy import IP
    >>> ip = IP('10.0.0.1')
    >>> ip.iptype()
    'PRIVATE'
    >>> ip = IP('8.8.8.8')
    >>> ip.iptype()
    'PUBLIC'
    
    # PRIVATE 表示私有地址, PUBLIC 表示公有地址
    

    int():返回IP地址的整数格式

    >>> from IPy import IP
    >>> ip = IP('10.0.0.1')
    >>> ip.int()
    167772161
    

    strHex():返回IP地址的十六进制格式

    >>> from IPy import IP
    >>> ip = IP('10.0.0.1')
    >>> ip.strHex()
    '0xa000001'
    

    strBin():返回IP地址的二进制格式

    >>> from IPy import IP
    >>> ip = IP('10.0.0.1')
    >>> ip.strBin()
    '00001010000000000000000000000001'
    

    PS:在数据库中存储IP地址有两种形式:

    1. 以变长字符串的形式将IP地址保存在数据库中
    2. 将IP地址转换为整数以后保存到数据库中

    转换成整数后进行存储可以有效的节省存储空间,提高数据库的存储效率和访问速度,所以在最佳实践中,一般将IP地址以数字的形式保存到数据库中。当需要IP地址时,我们再对整数的IP地址进行转换即可。

    mysql本身也提供了IP地址到证书的转换函数:

    mysql> select inet_aton('10.0.0.1')
        -> ;
    +-----------------------+
    | inet_aton('10.0.0.1') |
    +-----------------------+
    |             167772161 |
    +-----------------------+
    1 row in set (0.00 sec)
    
    mysql> select inet_ntoa('167772161');
    +------------------------+
    | inet_ntoa('167772161') |
    +------------------------+
    | 10.0.0.1               |
    +------------------------+
    1 row in set (0.00 sec)
    
    mysql> 
    

     而在Python中,通过int方法就可以进行转换 

    >>> from IPy import IP
    >>> ip = IP('167772161')
    >>> ip
    IP('10.0.0.1')
    >>> 
    
    # 转换成数字使用 int方法 即可
    

    网段管理

      IP类的构造函数可以接受多种类型的IP地址或者是一个网段格式。

    >>> from IPy import IP
    >>> IP('172.16.0.0/16')
    IP('172.16.0.0/16')
    >>> IP('172.16.0.0-172.31.255.255')
    IP('172.16.0.0/12')
    >>> IP('10.0.0.0/255.0.0.0')
    IP('10.0.0.0/8')
    >>> 
    
    # 当IP类的实例化参数是一个网段时,那么参数的主机地址必须为0,否则会提示IP地址前缀错误
    

      对于包含多个IP地址的对象,我们可以调用len方法或者内置的len方法,求出IP地址的个数

    >>> from IPy import IP
    >>> ip = IP('10.0.0.0/255.0.0.0')
    >>> ip.len()
    16777216
    >>> len(ip)
    16777216
    >>> 
    

      对于网段的地址,我们也可以利用for循环,得到其包涵的所有IP地址

    >>> from IPy import IP
    >>> ip = IP('10.0.0.0/30')
    >>> for i in ip:
    	print(i)
    	
    10.0.0.0
    10.0.0.1
    10.0.0.2
    10.0.0.3
    >>> 
    

      针对不同的显示方式,还可以使用strNormal方法,该方法接受一个 wantprefixlen 参数,参数的合法取值为 0 - 3,每一个取值表示一种显示方式

    >>> from IPy import IP
    >>> ip = IP('10.0.0.0/30')
    >>> ip.strNormal(0)
    '10.0.0.0'
    >>> ip.strNormal(1)
    '10.0.0.0/30'
    >>> ip.strNormal(2)
    '10.0.0.0/255.255.255.252'
    >>> ip.strNormal(3)
    '10.0.0.0-10.0.0.3'
    >>> 
    

      针对于网段而言,还可以获取其子网掩码,以及广播地址

    >>> from IPy import IP
    >>> ip = IP('10.0.0.0/30')
    >>> ip.netmask()
    IP('255.255.255.252')
    >>> ip.broadcast()
    IP('10.0.0.3')
    >>> 
    

      还可以进行ip的判断,判断其是否属于一个网段中,又或者两个网段中是否重叠

    >>> from IPy import IP
    >>> IP('10.0.0.1') in IP('10.0.0.0/24')
    True
    >>> IP('192.168.0.1') in IP('10.0.0.0/24')
    False
    >>> IP('10.0.0.0/24').overlaps('192.168.0.0/24')
    0
    >>> IP('10.0.0.0/8').overlaps('10.0.0.0/16')
    1
    >>> 
    
    # 0 表示不包涵,1表示包涵
    

      

      

  • 相关阅读:
    编写可读性代码的艺术
    web前端常见的加密算法介绍
    git 遇到的问题
    Vue.js使用proxytable跨域的路径问题
    设置动画元素
    解决echarts图表在显示没有数据后再切换后渲染不出的问题
    svn回滚到之前的版本
    插件用法--视频播放video.js
    网页适配
    不跳转页面下载文件
  • 原文地址:https://www.cnblogs.com/dachenzi/p/8676715.html
Copyright © 2011-2022 走看看