简介

  在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表示包涵

  

  

最新文章

  1. C#命名规则和编码规范
  2. c# ContinueWith 用法
  3. Maven学习(三)生命周期
  4. Selinux在HTTP+PHP服务中的安全权限修改
  5. bug:C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
  6. 根据ip查询地区,经纬度等-geoip2
  7. 《C和指针》 读书笔记 -- 第9章 字符串、字符和字节
  8. c++实现文本中英文单词和汉字字符的统计
  9. 浅谈Android架构之MVP,MVVM
  10. Servlet基础知识(一)——Servlet的本质
  11. springmvc上传图片,发送邮件
  12. BZOJ_3629_[JLOI2014]聪明的燕姿_dfs
  13. java 运算符的了解和运算符的优先级
  14. vivado2015.4保存ila波形数据
  15. XSS简介
  16. Modular Inverse(zoj3609+欧几里德)
  17. 解决mybatis报错Result Maps collection does not contain value for java.lang.Integer
  18. mac安装GnuGP
  19. webapi框架搭建-安全机制(一)
  20. 第1章—Spring之旅—简化Spring的java开发

热门文章

  1. 第61天:json遍历和封装运动框架(多个属性)
  2. 【Python】面向对象--类的特殊成员方法
  3. Spline样条函数 //C++关键字:operator // 重载函数 // 隐含的this指针 // 指针和const限定符
  4. BZOJ4767 两双手(组合数学+容斥原理)
  5. CentOS 不间断会话(ssh关闭后如何保证程序继续运行)(nohup和screen)
  6. POJ3254:Corn Fields——题解
  7. [Leetcode] reverse integer 反转整数
  8. 洛谷 P4597 序列sequence 解题报告
  9. IDEA中使用Docker: 图形化 or 命令行 ,你更稀罕那个??
  10. 学习操作Mac OS 之 常用命令