Преобразование адреса IPv4 или IPv6 в длинный для сравнения - PullRequest
3 голосов
/ 13 апреля 2010

Чтобы проверить, находится ли адрес 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

Мой вопрос: есть ли более простой способ сделать это, чего мне не хватает? Есть ли стандартный библиотечный вызов, который может сделать это для меня?

1 Ответ

2 голосов
/ 13 апреля 2010

IPy позволяет выполнять все виды преобразований как для адресов IPv4, так и для адресов IPv6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...