![]() |
1
31
This article
显示你可以用
此输出:
如果您只需要一个接受字符串的函数,它将如下所示:
|
![]() |
2
133
我喜欢使用 netaddr 为此:
正如Arno_v在评论中指出的,netaddr的新版本是这样的:
|
![]() |
3
101
使用 ipaddress ( in the stdlib since 3.3 , at PyPi for 2.6/2.7 ):
如果你想评估 许多 通过这种方式,您可能需要预先计算网络掩码,比如
然后,对于每个地址,用下列公式之一计算二进制表示:
最后,您可以简单地检查:
|
![]() |
4
9
这段代码在Linux x86上对我有效。我并没有真正考虑到endianes的问题,但是我已经用超过200K的IP地址对“ipaddr”模块进行了测试,对8个不同的网络字符串进行了测试,ipaddr的结果与此代码相同。
例子:
|
![]() |
5
6
我尝试了戴夫·韦伯的解决方案,但遇到了一些问题: 最基本的-匹配应该通过将IP地址与掩码进行anding来检查,然后检查结果是否与网络地址完全匹配。没有像以前那样用网络地址来填充IP地址。 我还注意到,如果忽略了endian行为,假设一致性可以保存,那么只对八位字节边界上的掩码有效(/24,/16)。为了使其他掩码(/23,/21)正常工作,我在结构命令中添加了一个“greater than”,并将用于创建二进制掩码的代码更改为从所有“1”开始并向左移动(32个掩码)。 最后,我添加了一个简单的检查,确认网络地址对掩码有效,如果不有效,只打印一个警告。 结果如下:
|
![]() |
6
6
我不喜欢在不需要模块的时候使用它们。这项工作只需要简单的数学,所以我的简单功能是:
然后使用它:
就是这样,这比上面包含模块的解决方案快得多。 |
![]() |
7
6
对于Python 3
|
![]() |
8
5
接受的答案不起作用…这让我很生气。mask是向后的,不适用于任何不是简单8位块的位(例如/24)。我调整了答案,它很好地工作。
下面是一个函数,它返回一个带点的二进制字符串,以帮助可视化屏蔽。有点像
如:
|
![]() |
9
4
在2.5的标准库中没有,但是ipaddr使这非常容易。我相信它在3.3中的名字是ipaddress。
|
![]() |
10
4
马克的密码几乎是正确的。代码的完整版本是-
很明显,来自与上面相同的来源… 一个非常重要的注意事项是,第一个代码有一个小故障-IP地址255.255.255.255也显示为任何子网的有效IP。我花了不少时间让这段代码正常工作,感谢马克给出了正确的答案。 |
![]() |
11
3
依赖于“struct”模块可能会导致endian ness和类型大小出现问题,而不需要这样做。socket.inet也不是。python非常适合点分四路IP地址:
我需要在每个socket accept()调用上对一组允许的源网络进行IP匹配,因此我将掩码和网络预计算为整数:
然后我可以快速查看给定的IP是否在这些网络中:
不需要导入模块,代码为 非常 匹配速度快。 |
![]() |
12
2
从netaddr导入所有匹配的目录
此方法的用法如下:
基本上,您提供一个IP地址作为第一个参数,并提供一个CIDR列表作为第二个参数。返回点击列表。 |
![]() |
13
2
#这在没有奇怪的逐字节处理的情况下工作正常 def addressinnetwork(IP,网络): ''是网络中的地址''' #将地址转换为主机顺序,这样移位实际上是有意义的。 ip=struct.unpack('>l',socket.inet_aton(ip))[0] netaddr,bits=net.split('/') netaddr=struct.unpack('>l',socket.inet_aton(netaddr))[0] #必须左移所有一个值,/32=零移位,/0=32左移 网络掩码=(0xffffffff<<(32 int(bits)))amp;0xffffffff #只要网络地址正确,就不需要屏蔽网络地址。 返回(IP&netmask)==netaddr |
![]() |
14
2
选择的答案有一个错误。 以下是正确的代码:
注:
我也代替
|
![]() |
15
2
以下是我为最长前缀匹配编写的类:
下面是一个测试程序:
|
![]() |
16
1
谢谢你的剧本!
所以我的新地址网络函数如下:
现在,答案是对的!!
我希望它能帮助其他人,为他们节省时间! |
![]() |
17
1
关于以上所有内容,我认为socket.inet anton()按网络顺序返回字节,因此解包它们的正确方法可能是
|
![]() |
18
1
以前的解决方案在ip&net==net中有一个错误。正确的IP查找是ip&netmask=net 固定码:
|
![]() |
19
1
在python中有一个名为subnettree的API可以很好地完成这项工作。 这是一个简单的例子:
|
![]() |
20
1
$python check-subnet.py版
|
![]() |
21
1
我对标准库一无所知,但是 PySubnetTree 是将进行子网匹配的python库。 |
![]() |
22
0
从上面的各种来源,以及我自己的研究,这就是我如何让子网和地址计算工作。这些部分足以解决问题和其他相关问题。
|
![]() |
23
0
这是我的密码
|
![]() |
24
0
如果不想导入其他模块,可以使用:
|
![]() |
25
0
我在这些答案中尝试了一个建议解决方案的子集。由于没有成功,我最终修改了建议的代码并编写了我的固定函数。 我测试过它,并且至少在小endian架构上工作——例如x86——如果有人喜欢尝试大endian架构,请给我反馈。
代码:
希望有用, |