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创建XML文档
Mar 01 Python
python使用os模块的os.walk遍历文件夹示例
Jan 27 Python
Python实现Linux下守护进程的编写方法
Aug 22 Python
编写Python小程序来统计测试脚本的关键字
Mar 12 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python:print格式化输出到文件的实例
May 14 Python
详解python 爬取12306验证码
May 10 Python
在pycharm中显示python画的图方法
Aug 31 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
Python txt文件如何转换成字典
Nov 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
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
Python对excel文档的操作方法详解
2018/12/10 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
python 图片去噪的方法示例
2019/07/09 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
舞蹈教育学专业推荐信
2013/11/27 职场文书
办护照工作证明范本
2014/01/14 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
员工福利申请报告
2015/05/15 职场文书
运动会广播稿20字
2015/08/19 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
python数字图像处理之图像的批量处理
2022/06/28 Python