【发布时间】:2010-04-13 17:07:49
【问题描述】:
为了检查 IPv4 或 IPv6 地址是否在某个范围内,我有一个代码,它采用 IPv4 地址,将其转换为 long,然后在子网的上限/下限上进行相同的转换,然后检查 long 是否在这些值之间。
我希望能够为 IPv6 做同样的事情,但在 Python 2.6 标准库中没有看到允许我这样做,所以我写了这个:
import socket, struct
from array import array
def ip_address_to_long(address):
ip_as_long = None
try:
ip_as_long = socket.ntohl(struct.unpack('L',
socket.inet_pton(socket.AF_INET, address))[0])
except socket.error:
# try IPv6
try:
addr = array('L', struct.unpack('!4L',
socket.inet_pton(socket.AF_INET6, address)))
addr.reverse()
ip_as_long = sum(addr[i] << (i * 32) for i in range(len(addr)))
except socket.error as se:
raise ValueError('Invalid address')
except Exception as e:
print str(e)
return ip_as_long
我的问题是:有没有我想念的更简单的方法来做到这一点?是否有标准库调用可以为我做到这一点?
【问题讨论】:
-
你能指定你尝试从哪个符号转换(我猜ipv4的点表示法和ipv6的十六进制表示法?)
-
是的,像 '192.168.1.1' 和 'fd00:dead:dead:beef:fade:f00f:d00d:1236' 这样的地址