【发布时间】:2012-08-07 08:17:45
【问题描述】:
是否有任何软件包或简单的方法可以将 ipv6 转换为整数?该算法应该有点聪明,可以理解 ipv6 短格式。在我开始编写自己的代码之前,我只是想知道是否有人知道可以完成这项工作的包?
谢谢,
【问题讨论】:
-
@stark:Python 支持任意长度的整数。
-
好像你不能用这样一个整数做很多事情,学习用例会很有趣。
是否有任何软件包或简单的方法可以将 ipv6 转换为整数?该算法应该有点聪明,可以理解 ipv6 短格式。在我开始编写自己的代码之前,我只是想知道是否有人知道可以完成这项工作的包?
谢谢,
【问题讨论】:
您可以在 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
【讨论】:
'foo'.encode('hex'),让你不必记住hexlify住在哪里。
你想要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
仅使用 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
【讨论】:
使用ipaddr 模块
>>> import ipaddr
>>> int(ipaddr.IPAddress('fe80::21b:77ff:fbd6:7860'))
338288524927261089654170743795120240736L
编辑:感谢@J.F.Sebastian 提供更好的方法
【讨论】:
ipaddr模块那么你可以int(ipaddr.IPAddress('fe80::21b:77ff:fbd6:7860'))
ipaddr 的模块 based 在 Python 3.3+ 中临时添加为 ipaddress 模块。
可能是你想要的netaddr。
>>> from netaddr import *
ip = IPNetwork('fe80::21b:77ff:fbd6:7860')
>>> print ip.value
338288524927261089654170743795120240736
【讨论】: