将IPv4或IPv6地址转换为长整型以进行比较
为了检查一个IPv4或IPv6地址是否在某个范围内,我写了一段代码。这个代码会把一个IPv4地址转换成一个长整型数字,然后对子网的上下限也做同样的转换,最后检查这个长整型数字是否在这两个值之间。
我想对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
我的问题是:有没有更简单的方法可以做到这一点?有没有标准库的函数可以帮我完成这个任务?