python实现ip和数字的互转
需求:1、通过将IP转为数字方便mysql 入库减少空间占用,也便于通过python比较最终转换成的数据是否相同,从而了解IP值是否相同。这里涉及IP,并不涉及掩码部分的计算;2、可以将数字再转化为IP。
一、ip转数字
1>>> ip2num = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])
2>>> ip2num('192.168.0.1')
33232235521
通过倒序的切割索引得出每个索引位具体的值,即j,i 的值。由于数字范围为0~255(共256个),所以再通过索引位求幂,再和本身的值求积,并求和。具体分解如下:
1>>> [256**j*int(i) for j,i in enumerate(x.split('.')[::-1])]
2[1, 0, 11010048, 3221225472]
3>>> for j,i in enumerate(x.split('.')[::-1]):
4... print j,i
5...
60 1
71 0
82 168
93 192
二、数字转IP
还是上面的IP ,可以通过简单的算法将数字再转为IP,具体代码如下:
1>>> num2ip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])
2>>> num2ip(3232235521)
3'192.168.0.1'
上例中先得出i 的值为[3, 2 , 1 ,0 ] ,实际上这部分得出的也是索引位的值,x 就是我们上面算到的求和后的值 3232235521 。该数分数除以256的索引位次方后,得出余数为256 ,就是每个索引位的对应值 。
注:在socket和struct模块中,可以调用这两个模块的内部已实现的方法,也可以实现上述功能,具体可以查看Python Socket模块中的IP转换函数 。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-ip2num/4504.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.