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中的try和finally和with方法
May 05 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
python中logging包的使用总结
Feb 28 Python
python实现梯度下降算法
Mar 24 Python
python 接收处理外带的参数方法
Dec 03 Python
python3实现弹弹球小游戏
Nov 25 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
Python csv文件记录流程代码解析
Jul 16 Python
cookies应对python反爬虫知识点详解
Nov 25 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
c#中的实现php中的preg_replace
2009/12/21 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
php设计模式之单例模式代码
2016/06/11 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
validator验证控件使用代码
2010/11/23 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
react 组件传值的三种方法
2019/06/03 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
Python模块学习 re 正则表达式
2011/05/19 Python
python中使用mysql数据库详细介绍
2015/03/27 Python
pycharm 安装JPype的教程
2019/08/08 Python
Bergfreunde丹麦:登山装备网上零售商
2017/02/26 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
高中地理教学反思
2014/01/29 职场文书
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
团支部建设方案
2014/05/02 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
优秀班组长事迹
2014/05/31 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL