将IPv4或IPv6地址转换为长整型以进行比较

3
为了检查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

我的问题是:有没有我所忽略的更简单的方法来做这件事?是否有标准库调用可以帮我完成这个任务?


你能指定你要转换的记号吗?(我猜你是指IPv4的点分十进制记号和IPv6的十六进制记号?) - KillianDS
是的,像“192.168.1.1”和“fd00:dead:dead:beef:fade:f00f:d00d:1236”这样的地址。 - jakehurst
1个回答

2

IPy 能够对IPv4和IPv6地址进行各种转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接