将IPv4或IPv6地址转换为long以进行比较

问题描述 投票:3回答:1

为了检查IPv4或IPv6地址是否在一定范围内,我得到的代码采用IPv4地址,将其转换为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

我的问题是:是否有一种更简单的方法可以解决这个问题?是否有可以为我执行此操作的标准库调用?

python ipv6
1个回答
2
投票

IPy允许您在IPv4和IPv6地址上进行各种转换。

© www.soinside.com 2019 - 2024. All rights reserved.