10

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

谢谢,

4

5 回答 5

17

您可以在标准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
于 2012-08-10T03:28:34.517 回答
7

你想要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
于 2012-08-10T02:56:31.360 回答
7

仅使用 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模块

>>> import ipaddress
>>> int(ipaddress.ip_address('fe80::fbd6:7860'))
338288524927261089654018896845572831328
于 2012-08-10T03:53:27.870 回答
4

使用ipaddr模块

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

编辑:感谢@JFSebastian 提供更好的方法

于 2012-08-10T03:35:24.120 回答
1

可能是netaddr你想要的。

>>> from netaddr import *
ip = IPNetwork('fe80::21b:77ff:fbd6:7860')
>>> print ip.value
338288524927261089654170743795120240736
于 2014-04-09T01:05:41.587 回答