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实现生成简单的Makefile文件代码示例
Mar 10 Python
Python中的pass语句使用方法讲解
May 14 Python
浅述python中argsort()函数的实例用法
Mar 30 Python
Python中max函数用于二维列表的实例
Apr 03 Python
python实现机器学习之多元线性回归
Sep 06 Python
在django admin中添加自定义视图的例子
Jul 26 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
Python线程协作threading.Condition实现过程解析
Mar 12 Python
在 Python 中使用 MQTT的方法
Aug 18 Python
python如何控制进程或者线程的个数
Oct 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
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
物流仓管员工作职责
2014/01/06 职场文书
公司联欢会策划方案
2014/05/19 职场文书
争先创优心得体会
2014/09/12 职场文书
承租经营合作者协议书
2014/10/01 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
不同意离婚上诉状
2015/05/23 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python
《废话连篇——致新手》——chinapizza
2022/04/05 无线电