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 paramiko实现ssh远程访问的方法
Dec 03 Python
python3实现UDP协议的服务器和客户端
Jun 14 Python
Python 串口读写的实现方法
Jun 12 Python
python打开windows应用程序的实例
Jun 28 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
Mar 19 Python
如何在Python对Excel进行读取
Jun 04 Python
为什么相对PHP黑python的更少
Jun 21 Python
如何使用Python自动生成报表并以邮件发送
Oct 15 Python
Django xadmin安装及使用详解
Oct 26 Python
深度学习小工程练习之垃圾分类详解
Apr 14 Python
python实现过滤敏感词
May 08 Python
python全面解析接口返回数据
Feb 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实现求相对时间函数
2015/06/15 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
深入理解python中的atexit模块
2017/03/07 Python
Python for循环生成列表的实例
2018/06/15 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
超市促销实习自我鉴定
2013/09/23 职场文书
销售代表求职自荐信
2013/10/01 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
大学生入党自荐书
2015/03/05 职场文书
红色革命电影观后感
2015/06/18 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
python 命令行传参方法总结
2021/05/25 Python
基于tensorflow权重文件的解读
2021/05/26 Python
实例详解Python的进程,线程和协程
2022/03/13 Python