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+OpenCV实现车牌字符分割和识别
Mar 31 Python
python 实时得到cpu和内存的使用情况方法
Jun 11 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python无限生成不重复(字母,数字,字符)组合的方法
Dec 04 Python
Python 把序列转换为元组的函数tuple方法
Jun 27 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
Python3 翻转二叉树的实现
Sep 30 Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 Python
基于python判断目录或者文件代码实例
Nov 29 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 Python
利用python做表格数据处理
Apr 13 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 变量定义和变量替换的方法
2009/07/30 PHP
前端必学之PHP语法基础
2016/01/01 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
Python程序设计入门(4)模块和包
2014/06/16 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python+django快速实现文件上传
2016/10/24 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
优秀干部获奖感言
2014/01/31 职场文书
个人求职信范文
2014/05/24 职场文书
森林防火标语
2014/06/23 职场文书
认识实习感想
2015/08/10 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers