计算一个 IP 地址属于哪些子网

Posted

技术标签:

【中文标题】计算一个 IP 地址属于哪些子网【英文标题】:Calculate which subnets an IP address belongs to 【发布时间】:2021-12-12 15:39:52 【问题描述】:

我有点卡在一个特定的问题上。我需要计算 IP 地址所属的子网。它可以用 SQL 或 Python 或类似的方式完成。

所以如果我有例如100.100.100.105 我需要获取所有子网:

100.100.100.105/32
100.100.100.104/31
100.100.100.104/30
100.100.100.104/29
100.100.100.96/28
100.100.100.96/27
100.100.100.64/26
...
100.64.0.0/10
100.0.0.0/9
...
64.0.0.0/2
0.0.0.0/1

但真的不知道如何解决这个问题。

【问题讨论】:

你想要达到的目标不是很清楚。如果您的输入是字符串(?)"100.100.100.105",您想取回所有看起来像["100.100.100.105/32", "100.100.100.105/21", etc...] 的字符串? 指定预期结果。 对不起,问题中列出的一长串子网是我想要的输出。因此,一个单一 IP 地址所在的所有子网的列表,从 /32/31 开始。 github.com/SinaKzlca/IPRangeAnalyzer 看看这个也许你发现了一些有用的东西 【参考方案1】:

您可以使用ipaddress 模块中内置的python3 来实现这一点

import ipaddress
addresses = []
# get the int representation of your ip
ip = int(ipaddress.IPv4Address('100.100.100.105'))

for mask in range(32):
    addresses.append(f'ipaddress.IPv4Address(ip & ((2**32-1)-(2**mask -1)))/32-mask ')

在每次迭代中,我们通过在 IP 的整数表示和掩码之间进行逻辑与运算来将掩码应用于我们的 IP。然后我们将结果转换为 ip 八位字节并附加“/24”子网符号。您可以将2**32-1 替换为4294967295,我将其留在那里以便更清楚地了解发生了什么。

【讨论】:

以上是关于计算一个 IP 地址属于哪些子网的主要内容,如果未能解决你的问题,请参考以下文章

子网掩码是啥意思

对于IP地址,怎样区分主机ID和网络ID

子网划分以及计算子网掩码(转载)

判断两个IP是否属于同一子网

华为OJ075-判断两个IP是否属于同一子网

华为机试HJ39:判断两个IP是否属于同一子网