需求: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转换函数