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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
Python入门篇之编程习惯与特点
Oct 17 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
使用Python的Twisted框架编写简单的网络客户端
Apr 16 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
python 全局变量的import机制介绍
Sep 07 Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 Python
python基础梳理(一)(推荐)
Apr 06 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
Python requests用法和django后台处理详解
Mar 19 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/02/22 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
php显示时间常用方法小结
2015/06/05 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
Node.js模块加载详解
2014/08/16 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
简述Python2与Python3的不同点
2018/01/21 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
四种会话跟踪技术
2015/05/20 面试题
人力资源管理毕业生自荐信
2013/11/21 职场文书
运动会方阵解说词
2014/02/12 职场文书
同学聚会策划方案
2014/06/06 职场文书
森林防火宣传标语
2014/06/27 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
Python代码实现双链表
2022/05/25 Python