ip_int
=
1234567
ip
=
IPy.intToIp
(
ip_int,
4
)
print
(
ip, type
(
ip
))
print
(
IPy.parseAddress
(
ip,
4
)
, type
(
IPy.parseAddress
(
ip,
4
)
[
0
]
))
python
的
IP
y模块虽然可以实现一些
ip
地址的判断,但是不是很完美,有些场景根本判断不出来,还会抛出异常,比如一个地址范围和一个
ip
/掩码,这种不同类型就无法判断。
对此通过自己写函数来实现
ip
地址的判断,实现的思路很简单,先把
ip
地址转换为一个十进制的范围数,然后来判断是否有包含关系。
#下面函数可以将
ip
转换为十进制数
def
ip
to
int
(self,
ip
):
s =
ip
.split('.')
for temp in s:
a=bin(
int
(temp))[2:]
a=a.zfill(8)
今天有人问我 “为什么数据库
中
有人推荐使用
int
类型来保存
IP
地址?”。现在(2020年)来看这个东西已经有点过时了,一方面是磁盘空间不在那么贵,另一方面是
IP
v6 与这条法则不兼容。
下面我们就来看一下把
IP
v4 地址转换成整数的原理和收益各是什么。
转换的原理
一个
IP
v4 类的地址共分为四个部分 0.0.0.0 然而每一个部分的取值范围都在 0 ~ 255;也就是说每一个部分都可以用一个字节来保存,总共写个字节就够了,4 个字节不就是
int
吗?
第一步 把
IP
地址的各个部分转换为一个字节,并拼接它们,那么会得到一个 4 字节的串。
import struct
大家应该都有所体会,对于字符串型的
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
def
ip
2
int
(
ip
):
return sum(
int
(v) * 256 ** (3 - i) for i, v in enumerate(
ip
.split(".")))
int
型整数值转为字符串
ip
:
def
int
2
ip
(number):
result = []
for i in range(4):
number, mod = divmod(number, 256)
result.insert(0, mo
if __name__ == '__main__':
ip
= '127.0.0.1'
int
_
ip
= struct.unpack('!I', socket.inet_aton(
ip
))[0]
pr
int
(
int
_
ip
)
str_
ip
= socket.inet_ntoa(struct.p...
在项目
中
,我们经常会保存用户的
ip
,做一些判断,但是由于sql效率的原因,存整形比较好,所以,我们要把
ip
转化
为
int
,如何
转化
那?
def
int
_
ip
(num):
s = []
for i in range(4):
s.append(str(num %256))
num //= 256
return '.'.join(s[::-1])
def
ip
_
int
(
ip
):
res = 0
for j, i in enumerate(i.
一个
IP
地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的
IP
地址转换为十进制格式表示的
IP
地址输出。
输入格式:
输入在一行
中
给出32位二进制字符串。
输出格式:
在一行
中
输出十进制格式的
IP
地址,其由4个十进制数组成(分别对应4个8位的二进制数),
中
间用“.”分隔开。
输入样例:
11001100100101000001010101110010
输出样例:
204.14...
使用
python
内置库进行
相互
转换
问题: 为什么要将
ip
转成
int
型呢? 在计算机
中
int
(2^32 一下都是) 内存占用4个bit
而str的字符串内存占用在7~~15 字符串
之间
, 一个字符占用2个字节
转换成
int
类型可以大大节省内存
import socket
import struct
ip
= '127.0.0.1'
int
_
ip
= struct.unpack('!I', socket.inet_aton(
ip
))[0]
pr
int
(
int
_
ip
) # Out: 2130706433
Python
3.4 官方文档说明:
socket.inet_aton(
ip
_string)
Convert an
IP
v4 address from dotted-quad string format (for example, ‘123.45.67.89’) to 32-bit packed b...
python
IP
转
int
和
int
转
IP
IP
地址意义
IP
地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。
IP
地址通常用“点分十进制”表示成(a.b.c.d)的形式,其
中
,a,b,c,d都是0~255
之间
的十进制整数。例:点分十进
IP
地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。