ipv6を整数に変換するパッケージまたは簡単な方法はありますか?アルゴリズムは、ipv6の短い形式を理解するために少し賢いはずです。私が自分のコードを書き始める前に、誰かがその仕事をすることができるパッケージを知っているかどうか疑問に思いますか?
ありがとう、
これは、標準の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
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
ipaddress
Python 3.3以降では、モジュールを使用できます。
>>> import ipaddress
>>> int(ipaddress.ip_address('fe80::fbd6:7860'))
338288524927261089654018896845572831328
ipaddr
モジュールを使用する
>>> import ipaddr
>>> int(ipaddr.IPAddress('fe80::21b:77ff:fbd6:7860'))
338288524927261089654170743795120240736L
編集:より良い方法を提供してくれた@JFSebastianに感謝します
あなたが望むかもしれnetaddr
ません。
>>> from netaddr import *
ip = IPNetwork('fe80::21b:77ff:fbd6:7860')
>>> print ip.value
338288524927261089654170743795120240736