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去除列表中重复元素的方法
Mar 20 Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
python 在屏幕上逐字显示一行字的实例
Dec 24 Python
Python lambda表达式用法实例分析
Dec 25 Python
Win10下Python3.7.3安装教程图解
Jul 08 Python
python利用7z批量解压rar的实现
Aug 07 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
详解pycharm配置python解释器的问题
Oct 15 Python
python中的yield from语法快速学习
Nov 06 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 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中将网址转换为超链接的函数
2011/09/02 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
php命令行写shell实例详解
2018/07/19 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
js实现图片漂浮效果的方法
2015/03/02 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Python实现的几个常用排序算法实例
2014/06/16 Python
Python深入学习之装饰器
2014/08/31 Python
Python中的闭包详细介绍和实例
2014/11/21 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
Python3分析处理声音数据的例子
2019/08/27 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
环境科学专业个人求职信
2013/09/26 职场文书
实习教师个人的自我评价
2013/11/08 职场文书
预备党员思想汇报
2014/01/08 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
Java实现带图形界面的聊天程序
2022/06/10 Java/Android