【问题标题】:How to convert from IPv6 to IPv4, and from there to an integer format如何从 IPv6 转换为 IPv4,并从那里转换为整数格式
【发布时间】:2017-11-03 05:25:03
【问题描述】:

如何将 IPv6 地址转换为 IPv4 地址,以及如何将 IPv4 地址解析为一组整数?

我有:

a = 'ff06::c3'

我想要:

4278583296.0.0.195

我想从那里得到:

a1 = 4278583296
a2 = 0
a3 = 0
a4 = 195

【问题讨论】:

  • ipv6 -> ipv4 -> int
  • 你有没有尝试过?请先写出你的解决方案。
  • 我已经整理了您的问题,因为您根本不清楚您想要实现什么。请注意格式。您在问题上投入的精力越多,就越有可能有人帮助您。我们都是这里的志愿者,所以我们期待您付出一些努力。本着这种精神,请向我们展示您已经尝试过的方法,以便我们可以真正帮助您解决问题,而不是我们为您解决问题。
  • 除了问题格式之外:IP 地址不是这样工作的。 IPv6 地址是 128 位的,而 IPv4 地址是 32 位的,所以你问的是不可能的。
  • ff06::c3 转换为 ff06:0:0:0:0:0:0:c3,而不是 ff06:0:0:c3。

标签: python python-2.7 ipv6 ipv4


【解决方案1】:

方法一: 您必须做的第一步是扩展 IPV6。一次,您扩展将其转换为十进制。一旦你将十进制值转换为二进制,然后最后使用公式来计算使用二进制的 IPV4。

方法二: 您可以使用 python lib“netaddr”(注意:您需要按照此说明安装 lib http://netaddr.readthedocs.io/en/latest/installation.html

然后你可以在你的代码中导入“netaddr:”并使用定义类似的方法,如下代码

>>> IPNetwork('::ffff:192.0.2.1/119').ipv6()
IPNetwork('::ffff:192.0.2.1/119')
>>> IPNetwork('::ffff:192.0.2.1/119').ipv6(ipv4_compatible=True)
IPNetwork('::192.0.2.1/119')
>>> IPNetwork('::ffff:192.0.2.1/119').ipv4()
IPNetwork('192.0.2.1/23')
>>> IPNetwork('::192.0.2.1/119').ipv4()
IPNetwork('192.0.2.1/23')

【讨论】:

  • 我认为这个答案不正确,因为 A)它没有完成 OP 想要的(也就是说,在这个答案的辩护中,难以理解)和 B)它建议在 ipaddress 时下载第三方模块自 Py3.3(2012 年 9 月 29 日)以来一直在 stdlib 中
【解决方案2】:

我不确定你为什么想要这样的东西,因为它与 IP 地址的实际工作方式没有任何对应关系,但你可以使用 Python3.3 的 ipaddress 模块轻松解析你的字符串.如果您不在 Python3.3 上,则必须为 IPv6 地址编写自己的解析器,将它们扩展为分解形式 ("0123:4567:89ab:cdef:fedc:ba98:7654:3210")

import ipaddress

myIP = ipaddress.ip_address('ff06::c3')

然后使用IPv6Address.exploded 转换为字符串并使用str.split(":") 获取每个十六进制数

hextets = myIP.exploded.split(":")

然后将每对十六进制映射到一个 32 位组中,并使用 int(grp, base=16) 解析为 int

import itertools

# from itertools recipes
def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)

new_groups = [int(a+b, base=16) for (a, b) in grouper(hextets, 2)]
# N.B. that a+b here is string concatenation, not addition

然后您可以使用str.joinmap 将它们放在一个带点的“IPv4”地址中

ipv4ish = '.'.join(map(str, new_groups))

和元组解包以获取每个单独的参数

a1, a2, a3, a4 = new_groups

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 2020-11-06
    • 1970-01-01
    • 2015-03-28
    • 2015-03-10
    • 2012-06-29
    • 2017-12-17
    • 2011-01-03
    • 2019-09-22
    相关资源
    最近更新 更多