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使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
Python3实现从文件中读取指定行的方法
May 22 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
python numpy函数中的linspace创建等差数列详解
Oct 13 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
python 字符串只保留汉字的方法
Nov 16 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
在CentOS7下安装Python3教程解析
Jul 09 Python
Python filter过滤器原理及实例应用
Aug 18 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 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
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
php项目打包方法
2008/02/18 PHP
php变量作用域的深入解析
2013/06/03 PHP
php实现encode64编码类实例
2015/03/24 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
js渐变显示渐变消失示例代码
2013/08/01 Javascript
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
Asp.Net之JS生成分页条的方法
2016/11/23 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
python实现的多线程端口扫描功能示例
2017/01/21 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
《花瓣飘香》教学反思
2014/04/15 职场文书
会议接待欢迎标语
2014/10/08 职场文书
银行自荐信怎么写
2015/03/05 职场文书
单位收入证明范本
2015/06/18 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS