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中的anydbm模版和shelve模版使用指南
Jul 09 Python
python 捕获shell脚本的输出结果实例
Jan 04 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
Python中dict和set的用法讲解
Mar 28 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
Python实现双向链表
May 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
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
详细解析Python中的变量的数据类型
2015/05/13 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
建筑工程实习自我鉴定
2013/09/19 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
施工安全汇报材料
2014/08/17 职场文书
社区助残日活动总结
2014/08/29 职场文书
党员自我剖析材料
2014/08/31 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
教师工作决心书
2015/02/04 职场文书
毕业论文致谢范文
2015/05/14 职场文书
python读取mat文件生成h5文件的实现
2022/07/15 Python