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基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
python difflib模块示例讲解
Sep 13 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
Python访问MongoDB,并且转换成Dataframe的方法
Oct 15 Python
浅析python的优势和不足之处
Nov 20 Python
python3.4爬虫demo
Jan 22 Python
python绘制多个子图的实例
Jul 07 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
如何基于Python创建目录文件夹
Dec 31 Python
Python求平面内点到直线距离的实现
Jan 19 Python
用python删除文件夹中的重复图片(图片去重)
May 12 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
Python中的列表生成式与生成器学习教程
2016/03/13 Python
python简单实现操作Mysql数据库
2018/01/29 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
Python for循环生成列表的实例
2018/06/15 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
Python3自定义json逐层解析器代码
2020/05/11 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
提拔干部考察材料
2014/05/26 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
旷工检讨书大全
2015/08/15 职场文书
python数据处理之Pandas类型转换
2022/04/28 Python