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 27 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
python中常用检测字符串相关函数汇总
Apr 15 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
PyTorch学习笔记之回归实战
May 28 Python
python修改txt文件中的某一项方法
Dec 29 Python
python实现控制台打印的方法
Jan 12 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
python中dict使用方法详解
Jul 17 Python
jenkins配置python脚本定时任务过程图解
Oct 29 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
Python异常处理机制结构实例解析
Jul 23 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有序表查找之插值查找算法示例
2018/02/10 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
python实现教务管理系统
2018/03/12 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
Python中的类与类型示例详解
2019/07/10 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
Python项目跨域问题解决方案
2020/06/22 Python
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
《维生素c的故事》教学反思
2014/02/18 职场文书
教师求职信范文
2014/05/24 职场文书
法学自荐信
2014/06/20 职场文书
商标侵权律师函
2015/05/27 职场文书
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库