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编程中的反模式实例分析
Dec 08 Python
Python探索之SocketServer详解
Oct 28 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
详解python数据结构和算法
Apr 18 Python
使用python实现ftp的文件读写方法
Jul 02 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
详解PyTorch中Tensor的高阶操作
Aug 18 Python
Python下利用BeautifulSoup解析HTML的实现
Jan 17 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
Python中常见的数制转换有哪些
May 27 Python
python 调用js的四种方式
Apr 11 Python
python 实现的截屏工具
May 08 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
PHPMailer安装方法及简单实例
2008/11/25 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
JS window.opener返回父页面的应用
2009/10/24 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
python中的多线程实例教程
2014/08/27 Python
Python类的专用方法实例分析
2015/01/09 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
Python持续监听文件变化代码实例
2020/07/22 Python
工程监理应届生求职信
2013/11/09 职场文书
领导失职检讨书
2014/02/24 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
雷峰塔导游词
2015/02/09 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技