使用python将IP范围划分为1024块

时间:2013-09-29 19:44:01

标签: python python-2.7 python-3.x

我有起始IP地址计数IP 。我想将计数分成1024块并按以下方式生成列表:

示例输入

ip = 90.1.0.0
count = 12000

所需输出(第1列表示起始IP,列#2表示计数)

90.1.0.0 1024
90.1.4.0 1024
90.1.8.0 1024
90.1.12.0 1024
90.1.16.0 1024
90.1.20.0 1024
90.1.24.0 1024
90.1.28.0 1024
90.1.32.0 1024
90.1.36.0 1024
90.1.40.0 1024
90.1.44.0 736

简短说明

  • 90.1.0.090.1.4.0之间将有1024个ips(总计数= 1024 * 1 = 1024

  • 90.1.4.090.1.8.0(总计数= 1024 * 2 = 2048)之间会有1024个ips,明智的

  • 90.1.36.090.1.40.0之间将有1024个ips(总计数= 1024 * 11 = 11264

  • 由于我们需要计数12000,因此在最后一个ip范围内需要{12000 - 11264 = 736} 90.1.40.0 to 90.1.44.0

其他示例

输入:

ip = 90.1.0.0
count = 32

输出:

90.1.0.0 32

你能否建议如何处理?我是Stack Overflow的新手,所以如果我错过了什么,请指导我。

提前致谢!

3 个答案:

答案 0 :(得分:2)

您可以尝试以下代码:

def from_string(s):
    "Convert dotted IPv4 address to integer."
    return reduce(lambda a,b: a<<8 | b, map(int, s.split(".")))

def to_string(ip):
    "Convert 32-bit integer to dotted IPv4 address."
    return ".".join(map(lambda n: str(ip>>n & 0xFF), [24,16,8,0]))

ip = '90.1.0.0'
count = 12000
block_size = 1024

ip_int = from_string(ip)
while count > 0:
    delta = min(count, block_size)
    print to_string(ip_int), delta
    ip_int += delta
    count -= delta

取自here的IP转换代码。

答案 1 :(得分:2)

python3附带了一个库ipaddress(对于python2,有一个backport),这使得使用ip地址变得非常容易。

在你的情况下,你可以编写一个生成你想要的结果的生成器:

import ipaddress

def addresses(start, count, interval):
    addr = ipaddress.ip_address(start)
    while count > 0:
            yield addr, min(count, interval)
            count -= interval
            addr += interval

for addr, num in addresses(u'90.1.0.0', 12000, 1024):
    print(addr, num)

答案 2 :(得分:0)

from_string函数也可以写成如下:

def from_string(s):
    return int('0x'+''.join(['%02x'%int(x) for x in s.split('.')]), 16)

和to_string函数:

import re
def to_string(ip):
    return '.'.join([str(int('0x'+x, 16)) for x in re.findall(r'(.{2})', str(hex(ip))[2:])])

注意:这些计算仅适用于IPv4