【问题标题】:IPv6 Address PythonIPv6 地址 Python
【发布时间】:2026-02-05 01:50:02
【问题描述】:

我的 IPv6 地址等于“2001:200:e000::/35”。 但是,我无法在库 ipaddress 的函数 ip_address() 上输入它。 该函数非常适用于不包含“/”的地址,例如 IPv4“1.0.0.0”和 IPv6“2001:12f8:0:17::23”:

ipaddress.ip_address(unicode("1.0.0.0","utf-8"))

返回:

IPv4Address(u'1.0.0.0')

还有

ipaddress.ip_address(unicode("2001:12f8:0:17::23","utf-8"))

返回:

IPv6Address(u'2001:12f8:0:17::23')

但是,当我尝试 IPv6 "2001:200:e000::/35" 时,

ipaddress.ip_address(unicode("2001:200:e000::/35","utf-8"))

返回:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/ipaddress.py", line 168, in ip_address
    address)
ValueError: u'2001:200:e000::/35' does not appear to be an IPv4 or IPv6 address

我应该如何将包含“/”的IP地址输入到ip_address?

【问题讨论】:

  • 我猜你已经知道你尝试的地址不适合作为 IPv6 地址,你还想放吗?
  • 斜线表示它不是单个地址,因为 ip6 /32 实际上代表了 65536 个地址的范围。所以它本身不是一个地址。

标签: python ip-address ipv6 ipv4


【解决方案1】:

您所说的“带有/的IP地址”实际上并不是IP地址。它们是称为“CIDR 表示法”的 IP 网络(表示 IP 地址范围)。

您可以使用ipaddress.ip_network() 处理IP 网络。例如:

>>> ipn = ipaddress.ip_network("2001:200:e000::/35")
>>> ipn.num_addresses
9903520314283042199192993792

【讨论】:

  • 值得注意的是,“IP 地址/前缀长度”在表示地址和子网大小时非常常见。与“全零”主机部分指定网络地址的 IPv4 不同,在 IPv6 中 2001:db8::/64(最后 64 位中的全零)是有效的主机地址和前缀。但是/35 的前缀大小,如问题所示,不会是单个子网。