python IP地址转整数


Posted in Python onNovember 20, 2020

背景

今天有人问我 “为什么数据库中有人推荐使用 int 类型来保存 IP 地址?”。现在(2020年)来看这个东西已经有点过时了,一方面是磁盘空间不在那么贵,另一方面是 IPv6 与这条法则不兼容。

下面我们就来看一下把 IPv4 地址转换成整数的原理和收益各是什么。

转换的原理

一个 IPv4 类的地址共分为四个部分 0.0.0.0 然而每一个部分的取值范围都在 0 ~ 255;也就是说每一个部分都可以用一个字节来保存,总共写个字节就够了,4 个字节不就是 int 吗?

第一步 把 IP 地址的各个部分转换为一个字节,并拼接它们,那么会得到一个 4 字节的串。

import struct

def aton(ip_address: str) -> bytes:
  result = []
  for i in ip_address.split('.'):
    result.append(struct.pack("!B", int(i)))
  return b''.join(result)

第二步 把字节串转换成整数。

In [2]: aton("127.0.0.1")                                                   
Out[2]: b'\x7f\x00\x00\x01'

In [3]: int.from_bytes(b'\x7f\x00\x00\x01','big')                                       
Out[3]: 2130706433

这样我们就把 IPv4 地址转换成了一个整数,完整的代码如下。

import struct


def aton(ip_address: str) -> bytes:
  result = []
  for i in ip_address.split('.'):
    result.append(struct.pack("!B", int(i)))
  return b''.join(result)


if __name__ == "__main__":
  bts = aton("127.0.0.1")
  print(int.from_bytes(bts, 'big'))

运行效果如下。

python3 main.py 
2130706433

转换的收益与限制

如果不做转换可以使用 varchar 来保存 IPv4 地址,这样的话需要 15 (3*4 + 3) 个字节才行;如果转换一下只需要 4 个字节就行了,节约了磁盘空间,可能会多用点 cpu 时间。

今天来说 IPv6 已经是主流,它的长度直接从之前的 4 字节直接涨到了 16 字节;int 不再能满足需求,为了可以统一处理这两种类型的 IP 现在推荐使用 varchar 来保存。

inet_aton 与 inet_ntoa

这一对 IP 是 IPv4 时代的转换函数,目前来看已经过时。

1、inet_aton IP 转数字。

In [4]: socket.inet_aton("127.0.0.1")                                             
Out[4]: b'\x7f\x00\x00\x01'

2、inet_ntoa 数字转 IP。

In [5]: socket.inet_ntoa(b'\x7f\x00\x00\x01')                                         
Out[5]: '127.0.0.1'

inet_pton 与 inet_ntop

这是一对新的 API ,这对 API 兼容了 IPv4 和 IPv6 。

In [6]: socket.inet_pton(socket.AF_INET6,"5aef:2b::8")                                     
Out[6]: b'Z\xef\x00+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08'

In [7]: socket.inet_ntop(socket.AF_INET6,b'Z\xef\x00+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08')            
Out[7]: '5aef:2b::8'

In [8]: socket.inet_pton(socket.AF_INET,"127.0.0.1")                                      
Out[8]: b'\x7f\x00\x00\x01'

In [9]: socket.inet_ntop(socket.AF_INET,b'\x7f\x00\x00\x01')                                 
Out[9]: '127.0.0.1'

以上就是python IP 地址转整数的详细内容,更多关于python ip地址转整数的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
初学Python实用技巧两则
Aug 29 Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
python 为什么说eval要慎用
Mar 26 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
Python django框架 web端视频加密的实例详解
Nov 20 #Python
总结python 三种常见的内存泄漏场景
Nov 20 #Python
Python偏函数实现原理及应用
Nov 20 #Python
python与idea的集成的实现
Nov 20 #Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 #Python
python3 re返回形式总结
Nov 20 #Python
python 实现图片修复(可用于去水印)
Nov 19 #Python
You might like
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
python如何实现excel数据添加到mongodb
2015/07/30 Python
老生常谈Python基础之字符编码
2017/06/14 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
PyQt5实现简易电子词典
2019/06/25 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
django rest framework 自定义返回方式
2020/07/12 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
高一自我鉴定
2013/12/17 职场文书
门卫人员岗位职责
2013/12/24 职场文书
师说教学反思
2014/02/07 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
网络舆情信息简报
2015/07/21 职场文书