2010-04-13 1 views
3

IPv4 또는 IPv6 주소가 특정 범위 내에 있는지 확인하기 위해 IPv4 주소를 사용하는 코드를 가져 와서 길게 만든 다음 서브넷의 상한/하한 경계를 변환 한 다음 해당 값 사이에 long 값이 있는지 확인합니다.IPv4 또는 IPv6 주소를 비교할 때 길게 변환

내가 IPv6를 위해 같은 일을 할 수 있기를 좋아하지만, 내가이 작업을 수행 할 수 있도록 파이썬 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 

내 질문을 내가 누락 된 간단한 방법이 있습니까? 이 작업을 수행 할 수있는 표준 라이브러리 호출이 있습니까?

+0

변환 할 표기법을 지정할 수 있습니까? (ipv4의 점으로 구분 된 표기법과 ipv6의 16 진수 표기법을 추측 할 수 있습니까?) – KillianDS

+0

예 : '192.168.1.1'및 'fd00 : dead : dead : dead : beef : fade : f00f : d00d : 1236 ' –

답변

2

IPy을 사용하면 IPv4 및 IPv6 주소 모두에서 모든 종류의 변환을 수행 할 수 있습니다.