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生成随机验证码(中文验证码)示例
Apr 03 Python
详解Python中dict与set的使用
Aug 10 Python
python基础教程之分支、循环简单用法
Jun 16 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
python读取几个G的csv文件方法
Jan 07 Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
python3.x提取中文的正则表达式示例代码
Jul 23 Python
python Django里CSRF 对应策略详解
Aug 05 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 Python
python中如何对多变量连续赋值
Jun 03 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
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
解析link_mysql的php版
2013/06/30 PHP
PHPThumb图片处理实例
2014/05/03 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
php实现购物车功能(上)
2020/07/23 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
150行代码带你实现微信小程序中的数据侦听
2019/05/17 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Python tkinter三种布局实例详解
2020/01/06 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
《要下雨了》教学反思
2014/02/17 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
学校标语口号大全
2015/12/26 职场文书
Python 多线程处理任务实例
2021/11/07 Python
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL