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

3 投票
1 回答
3744 浏览
提问于 2025-04-15 21:33

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

我的问题是:有没有更简单的方法可以做到这一点?有没有标准库的函数可以帮我完成这个任务?

1 个回答

2

IPy 是一个工具,可以让你对IPv4和IPv6地址进行各种转换。

撰写回答