>>
>
import
struct
>>
>
int_ip
=
123456789
>>
>
ip
=
socket
.
inet_ntoa
(
struct
.
pack
(
'I'
,
socket
.
htonl
(
int_ip
)
)
)
'7.91.205.21'
>>
>
socket
.
ntohl
(
struct
.
unpack
(
"I"
,
socket
.
inet_aton
(
str
(
ip
)
)
)
[
0
]
)
123456789L
其实这是进制数的转换,我们可以自己写代码
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
>>
>
def
ch1
(
num
)
:
s
=
[
]
for
i
in
range
(
4
)
:
s
.
append
(
str
(
num
%
256
)
)
num
/=
256
return
'.'
.
join
(
s
[
:
:
-
1
]
)
>>
>
ch1
(
123456789
)
'7.91.205.21'
用lambda的方式,整数toIP 地址 一行代码搞定
>>> ch2 = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])
>>> ch2(123456789)
'7.91.205.21'
用lambda的方式,IP地址转换到整数
>>> ch3 = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])
>>> ch3('7.91.205.21')
123456789
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 1
Python IP地址转整数和整数转IP地址IP地址转整数代码:[root@ops-ip-statistic]# cat iptonum.py
#!/usr/bin/env python
import sys
ip=sys.argv[1]
[steven@txzxp2 test]$
python
Python 2.7.5 (default, Jul 8 2013, 09:48:59)
[GCC 4.8.1 20130603 (Red Hat 4.8.1-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
1. strip 函数接受参数,可删除两边的字符,例如 strip('0b') 0和b是或的关系。在代码中使用了lstrip 是因为bin函数进行转换成二进制数字时会自动添加0b
2. zfill的功能是将字符串右对齐,前面用0补齐。
3. 代码中调用的方法对于参数有要求是字符串或是整型的,这点需要注意转换
代码实现:
def integerToIP(integer):
bi = "0"*(32-len(bi))+bi
# 8个一组算出每8个数字的十进制,然后再加“,”分隔
ret_ip_string = '.'.join(list(map(lambda x:str(int(x,2)),re.findall(r'.{8}',bi))))
# 打印ip字符串
大家应该都有所体会,对于字符串型的IP存入数据库中,实在是个即浪费空间又浪费性能的家伙,所以可爱的人们想出来将IP转换为整型存储。MySQL中存在INET_ATON() 、INET_NTOA()函数进行IP整型和字符串之间的转换,那么Python中存在什么方法可以实现MySQL中INET_ATON() 、INET_NTOA()的功能呢?方法肯定是有的~
# 导入相关模块包
import socket
import struct
# 将IP从字符串转为整型
>>> int(socket.inet_aton('127.0.0.1').encode('hex'),16)
21307
原理:
ip地址的每段可以看成是
一个0-255的
整数,把每段拆分成
一个二进制形式组合起来,然后把这个二进制数转变成
一个长
整数。
举例:
一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
# 数字 ==> ip # 数字范围[0, 255^4]
>>> num2ip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])
>>> num2ip(3232235521)
'192.168.0.1'
# ip ==> 数字
注意:IP可能超过int需要用无符号整型,并且牛客的判题系统while中的scanf必须要不等于EOF不然会出错。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int main(){
unsigned int...
python教程:读取.dcm文件,并转化为.jpg格式
NAhahahahaha:
Python复制文件的9个方法
清韵凌波:
python下载文件的三种方法
OTZ_2333: