2010-04-13 101 views
3

为了检查IPv4或IPv6地址是否在一定范围内,我已经获得了需要IPv4地址的代码,并将其转换为长整型,然后执行相同操作转换到子网的上/下限,然后检查长是否在这些值之间。将IPv4或IPv6地址转换为长字来进行比较

我希望能够做同样的事情对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 

我的问题是:有没有更简单的方法来做到这一点,我失踪了?有没有可以为我做的标准库调用?

+0

你能指定你尝试从哪个符号转换(我猜ipv4的虚线符号和ipv6的十六进制符号吗?) – KillianDS 2010-04-13 17:23:22

+0

是的,地址如'192.168.1.1'和'fd00:dead:dead:beef:fade :F00F:D00D:1236' – 2010-04-13 17:57:04

回答

2

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