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之从格式化表达式到方法
Sep 28 Python
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
Sanic框架Cookies操作示例
Jul 17 Python
pandas计算最大连续间隔的方法
Jul 04 Python
pandas分区间,算频率的实例
Jul 04 Python
Python代码太长换行的实现
Jul 05 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
Apr 23 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
Python3使用Selenium获取session和token方法详解
Feb 16 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判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
用于table内容排序
2006/07/21 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
python中将字典转换成其json字符串
2014/07/16 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
Python中str.format()详解
2017/03/12 Python
Python实现的快速排序算法详解
2017/08/01 Python
Python读写zip压缩文件的方法
2018/08/29 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
学生实习自我鉴定
2013/10/11 职场文书
优秀士兵个人事迹材料
2014/01/19 职场文书
上课睡觉检讨书
2014/01/28 职场文书
幼师求职信
2014/06/23 职场文书
自我检讨书范文
2015/01/28 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
入党群众意见范文
2015/06/02 职场文书