转自:http://chenpeng.info/html/1139
python整数与IP地址转换
看过Discuz!论坛的数据库用户表的设计,用户相关的ip地址和时间戳一般都用的一个int(10)的字段来存储。存储int相对于char来说,当然是优点多多了。
python怎样将一个整数与IP地址相互转换?
>>> import socket,struct
>>> int_ip = 123456789
>>> socket.inet_ntoa(struct.pack(‘I’,socket.htonl(int_ip)))#整数转换为ip地址
’7.91.205.21′
>>> str(socket.ntohl(struct.unpack(“I”,socket.inet_aton(“255.255.255.255″))[0]))#ip地址转换为整数
’4294967295′
实际上也就是进制数的转换
用lambda的方式,int2ip一行代码搞定
>>> int2ip = lambda x: ‘.’.join([str(x/(256**i)%256) for i in range(3,-1,-1)])
>>> int2ip(123456789)
’7.91.205.21′
用lambda的方式,ip2int
>>> ip2int = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])
>>> ip2int(’7.91.205.21′)
123456789
其实这是进制数的转换,我们可以自己写代码
# 整数to IP地址格式
用lambda的方式,整数toIP 地址 一行代码搞定
用lambda的方式,IP地址转换到整数
转自:http://orgcent.com/ip-address-integer-convert/
java实现:
1、IP地址转换为整数
原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个无符号32为整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制就是:167773121,即该IP地址转换后的数字就是它了。
String [ ] items = ip. split ( "\\." ) ;
return Long. valueOf (items [ 0 ] ) < < 24
| Long. valueOf (items [ 1 ] ) << 16
| Long. valueOf (items [ 2 ] ) << 8 | Long. valueOf (items [ 3 ] ) ;
}
2、整数转换为IP地址
原理:把这个整数转换成一个32位二进制数。从左到右,每8位进行一下分割,得到4段8位的二进制数,把这些二进制数转换成整数然后加上”.”就是这个ip地址了
举例:167773121
二进制表示形式为:00001010 00000000 00000011 11000001
分割成四段:00001010,00001010,00000011,11000001,分别转换为整数后加上“.”就得到了10.0.3.193。
StringBuilder sb = new StringBuilder ( ) ;
sb. append (ipInt & 0xFF ). append ( "." ) ;
sb. append ( (ipInt >> 8 ) & 0xFF ). append ( "." ) ;
sb. append ( (ipInt >> 16 ) & 0xFF ). append ( "." ) ;
sb. append ( (ipInt >> 24 ) & 0xFF ) ;
return sb. toString ( ) ;
}
IP地址排序问题可参考:
http://blog.csdn.net/shanliangliuxing/article/details/8970764