使用Python对IP进行转换的一些操作技巧小结


Posted in Python onNovember 09, 2015

Python Socket模块中包含一些有用IP转换函数,说明如下:

socket.ntohl(x)     // 类似于C语言的ntohl(x)

把32位正整数从网络序转换成主机字节序。

socket.ntohs(x)    // 类似于C语言的ntohs(x)

把16位正整数从网络序转换成主机字节序。

socket.htonl(x)     // 类似于C语言的htonl(x)

把32位正整数从主机字节序转换成网络序。

socket.htons(x)    // 类似于C语言的htons(x)

把16位正整数从主机字节序转换成网络序。

socket.inet_aton(ip_string) // 依赖于inet_aton的C实现

转换IPV4地址字符串(192.168.10.8)成为32位打包的二进制格式(长度为4个字节的二进制字符串),它不支持IPV6。inet_pton()支持IPV4/IPV6地址格式。

socket.inet_ntoa(packed_ip)

转换32位打包的IPV4地址为IP地址的标准点号分隔字符串表示。

socket.inet_pton(address_family,ip_string)

转换IP地址字符串为打包二进制格式。地址家族为AF_INET和AF_INET6,它们分别表示IPV4和IPV6。

socket.inet_ntop(address_family,packed_ip)

转换一个打包IP地址为标准字符串表达式,例如:“5aef:2b::8”或“127.0.0.1”。

>>>import socket
>>>import struct
>>>socket.ntohl(struct.unpack("i",socket.inet_aton("10.10.58.64"))[0])
168442432L
>>>socket.inet_ntoa(struct.pack("i", socket.htonl(168442432L)))
'10.10.58.64'
>>>struct.unpack("=I", socket.inet_aton("190.10.58.64"))
(1077545662,)
>>>socket.inet_ntoa(struct.pack("=I", 1077545662))
'190.10.58.64'
# 从IP地址字符串转换为整数值

defIp2Int(ip_string):
     return struct.unpack(“!I”,socket.inet_aton(ip))[0
# 从网络字节序的数字转换为IP地址(点号分隔)

def Int2Ip(ip):
     return socket.inet_ntoa(struct.pack(“!I”,ip))

也可以简单地使用lambda函数来实现ip和数字的互转:
ip转数字

>>> ip2num = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])
>>> ip2num('192.168.0.1')
3232235521

通过倒序的切割索引得出每个索引位具体的值,即j,i 的值。由于数字范围为0~255(共256个),所以再通过索引位求幂,再和本身的值求积,并求和。具体分解如下:

>>> [256**j*int(i) for j,i in enumerate(x.split('.')[::-1])]
[1, 0, 11010048, 3221225472]
>>> for j,i in enumerate(x.split('.')[::-1]):
...   print j,i
...
0 1
1 0
2 168
3 192

数字转IP

还是上面的IP ,可以通过简单的算法将数字再转为IP,具体代码如下:

>>> num2ip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])
>>> num2ip(3232235521)
'192.168.0.1

上例中先得出i 的值为[3, 2 , 1 ,0 ] ,实际上这部分得出的也是索引位的值,x 就是我们上面算到的求和后的值 3232235521 。该数分数除以256的索引位次方后,得出余数为256 ,就是每个索引位的对应值 。

Python 相关文章推荐
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
python配置文件写入过程详解
Oct 19 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
django下创建多个app并设置urls方法
Aug 02 Python
容易被忽略的Python内置类型
Sep 03 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
Python实现模拟时钟代码推荐
Nov 08 #Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 #Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 #Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 #Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 #Python
Windows下为Python安装Matplotlib模块
Nov 06 #Python
python 的列表遍历删除实现代码
Apr 12 #Python
You might like
php adodb连接mssql解决乱码问题
2009/06/12 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
JavaScript 事件系统
2010/07/22 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
简单谈谈React中的路由系统
2017/07/25 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
Python的语言类型(详解)
2017/06/24 Python
Python编写一个闹钟功能
2017/07/11 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
Python 多维List创建的问题小结
2019/01/18 Python
python3实现逐字输出的方法
2019/01/23 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
详解python变量与数据类型
2020/08/25 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
学前班语言教学计划
2015/01/20 职场文书
学校团代会开幕词
2016/03/04 职场文书
六年级作文之预言作文
2019/10/25 职场文书
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL