python实现ip和数字的互转

需求:1、通过将IP转为数字方便mysql 入库减少空间占用,也便于通过python比较最终转换成的数据是否相同,从而了解IP值是否相同。这里涉及IP,并不涉及掩码部分的计算;2、可以将数字再转化为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 ,就是每个索引位的对应值 。

注:在socket和struct模块中,可以调用这两个模块的内部已实现的方法,也可以实现上述功能,具体可以查看Python Socket模块中的IP转换函数

python实现ip和数字的互转》有1条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注