【问题标题】:python convert ipv6 to an integerpython将ipv6转换为整数
【发布时间】:2012-08-07 08:17:45
【问题描述】:

是否有任何软件包或简单的方法可以将 ipv6 转换为整数?该算法应该有点聪明,可以理解 ipv6 短格式。在我开始编写自己的代码之前,我只是想知道是否有人知道可以完成这项工作的包?

谢谢,

【问题讨论】:

  • @stark:Python 支持任意长度的整数。
  • 好像你不能用这样一个整数做很多事情,学习用例会很有趣。

标签: python ipv6


【解决方案1】:

您可以在 standard Python 套接字模块的帮助下做到这一点。 socket.inet_pton() 处理 IPV6 短格式没有任何问题。

import socket
from binascii import hexlify

def IPV6_to_int(ipv6_addr):
    return int(hexlify(socket.inet_pton(socket.AF_INET6, ipv6_addr)), 16)

>>> IPV6_to_int('fe80:0000:0000:0000:021b:77ff:fbd6:7860')
338288524927261089654170743795120240736L
>>> IPV6_to_int('fe80::021b:77ff:fbd6:7860')
338288524927261089654170743795120240736L

【讨论】:

  • @J.F. Sebastian:当然,这也有效,但使用 hexlify() 和 int() 对我来说似乎更清楚。很明显,您正在将基数 16 字符串转换为 int 等。相反,使用 struct.unpack() 及其深奥的格式字符串(我总是必须查找)然后摆弄这些位并不那么清楚,IMO。
  • 还有'foo'.encode('hex'),让你不必记住hexlify住在哪里。
【解决方案2】:

你想要IPy

>>> IPy.IP('fe80::21b:77ff:fbd6:7860')
IP('fe80::21b:77ff:fbd6:7860')
>>> IPy.IP('fe80::21b:77ff:fbd6:7860').int()
338288524927261089654170743795120240736L

>>> IPy.IP('fe80::fbd6:7860')
IP('fe80::fbd6:7860')
>>> IPy.IP('fe80::fbd6:7860').int()
338288524927261089654018896845572831328L
【解决方案3】:

仅使用 stdlib 的另一种解决方案:

import socket
import struct

def int_from_ipv6(addr):
    hi, lo = struct.unpack('!QQ', socket.inet_pton(socket.AF_INET6, addr))
    return (hi << 64) | lo

示例

>>> int_from_ipv6('fe80::fbd6:7860')
338288524927261089654018896845572831328L

在 Python 3.3+ 上,您可以使用 ipaddress module:

>>> import ipaddress
>>> int(ipaddress.ip_address('fe80::fbd6:7860'))
338288524927261089654018896845572831328

【讨论】:

    【解决方案4】:

    使用ipaddr 模块

    >>> import ipaddr
    >>> int(ipaddr.IPAddress('fe80::21b:77ff:fbd6:7860'))
    338288524927261089654170743795120240736L
    

    编辑:感谢@J.F.Sebastian 提供更好的方法

    【讨论】:

    • 如果你选择使用ipaddr模块那么你可以int(ipaddr.IPAddress('fe80::21b:77ff:fbd6:7860'))
    • @J.F.Sebastian,前几天有一个类似的问题。我当时就是这样做的 :) 有人说 ipaddr 正在进入标准库,所以我想我会在这里使用它
    • 基于 ipaddr 的模块 based 在 Python 3.3+ 中临时添加为 ipaddress 模块。
    【解决方案5】:

    可能是你想要的netaddr

    >>> from netaddr import *
    ip = IPNetwork('fe80::21b:77ff:fbd6:7860')
    >>> print ip.value
    338288524927261089654170743795120240736
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2015-03-28
      • 1970-01-01
      相关资源
      最近更新 更多