python ip 地址转换

# vim: tabstop=4 shiftwidth=4 softtabstop=4


# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.

# Copyright 2010 United States Government as represented by the

# Administrator of the National Aeronautics and Space Administration.

# All Rights Reserved.

#

# Licensed under the Apache License, Version 2.0 (the "License"); you may

# not use this file except in compliance with the License. You may obtain

# a copy of the License at

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

# License for the specific language governing permissions and limitations

# under the License.

"""


"""





from socket import inet_aton ,inet_ntoa

from struct import unpack , pack

import sys

import math

from nova import log as logging

from nova import flags

from nova import utils



LOG = logging.getLogger(__name__)


FLAGS = flags.FLAGS



def long2ip(ip):

""" long into ip str type """

return inet_ntoa(pack("!L", ip))



def num2masklen(n):

""" Computeing number size to masklen """

return 32 - int(math.log(n,2))


def ip2long(ip_addr):

""" Ip into long type """

return unpack("!L", inet_aton(ip_addr))[0]


def unsigned32(n):

return n & 0xffffffff


def masklen2maskbit(n):

""" Computing mask is int """

return unsigned32(~((1 << (32-n)) - 1))


def masklen2size(n):

""" Computing network bit : 1 << (32 - n )"""

return (1 << (32-n))


def load_used_ip_list():

subnet = dict()

cidrs = list()

cidrs = []#[u'172.122.0.0/29', u'172.122.0.8/29', u'172.122.0.32/28',u'172.122.0.48/28', u'172.122.0.240/28',u'172.122.1.240/28']

for net in cidrs:

ip_str = net.split('/')[0]

netBit = net.split('/')[1]

subnet[ip_str] = dict()

subnet[ip_str] = get_net_info(ip_str,int(netBit))

return subnet


def be_used(ip):

""" """

#for item in used_ip_list:

#used_ip_list = [{'net': 2893676544, 'bcast': 2893676799}]

#print net , used_net[net]

used_net = load_used_ip_list()

for net in used_net:

if ip >= used_net[net]['net'] and ip <= used_net[net]['bcast']:

return True

return False


def get_net_info(ip_str, masklen):

""" From openstack db read used cidr """

netInfo = dict()

netInfo['ip'] =ip2long(ip_str)

netInfo['maskbit'] = masklen2maskbit(masklen)

netInfo['size'] = masklen2size(masklen)

netInfo['net'] = netInfo['ip'] & netInfo['maskbit']

netInfo['bcast'] = netInfo['net'] + netInfo['size'] - 1

print netInfo

return netInfo


def work():

# Initializes the network range

big_ip_str = '172.122.0.0'

big_masklen = 16

big_ip = ip2long(big_ip_str)

big_maskbit = masklen2maskbit(big_masklen)

big_len = masklen2size(big_masklen)

big_net = big_ip & big_maskbit

big_bcast = big_net + big_len - 1



masklen = num2masklen(4)

ip = big_net

maskbit = masklen2maskbit(masklen)

n = masklen2size(masklen)


while(ip <= big_bcast):

net = ip & maskbit

bcast = net + n - 1

if be_used(net) or be_used(bcast):

ip = bcast + 1

print ""+long2ip(ip)+"---"+str(n)+"--"+long2ip(bcast)

continue

else:

#print "============++++++++++>"+long2ip(ip)+"/"+str(masklen)

return long2ip(ip)+"/"+str(masklen)

break



if __name__ == "__main__":

sc = work()

print sc ,'sc'



本文转自 swq499809608 51CTO博客,原文链接:http://blog.51cto.com/swq499809608/1298760

你可能感兴趣的:(python ip 地址转换)