#!/usr/bin/python
# -*- coding: utf-8; mode: python -*-
# Copyright (C) 2011 Göran Weinholt <goran@weinholt.se>.

def encidr(cidr):
    """Encodes a CIDR (x.y.z.w/len) as a 33-bit integer."""
    import socket,struct
    (addr,length)=cidr.split('/')
    ip = struct.unpack("!I", socket.inet_pton(socket.AF_INET, addr))[0]
    l = 32-int(length)
    return ((ip&~((1<<l)-1))<<1) | (1<<l)

def decidr(x):
    """Decodes a CIDR that was encoded with encidr."""
    import socket,struct,math
    fbs = x & (-x)
    x &= x-1
    l = math.ceil(math.log(fbs,2))   #__builtin_ffs
    return "%s/%d"%(socket.inet_ntop(socket.AF_INET, struct.pack("!I",x>>1)),32-l)
