使用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实现设置windows桌面壁纸代码分享
Mar 28 Python
python开发之函数定义实例分析
Nov 12 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
python机器人运动范围问题的解答
Apr 29 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
django实现模板中的字符串文字和自动转义
Mar 31 Python
8种常用的Python工具
Aug 05 Python
python3实现简单飞机大战
Nov 29 Python
python实现图片批量压缩
Apr 24 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
做一个有下拉功能的留言版
2006/10/09 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
python 实现归并排序算法
2012/06/05 Python
python3.3实现乘法表示例
2014/02/07 Python
机器学习python实战之手写数字识别
2017/11/01 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
python 实现list或string按指定分段
2019/12/25 Python
小学科学教学反思
2014/01/26 职场文书