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

2024-05-13 19:36:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

样本输入

ip = 90.1.0.0
count = 12000

期望输出(第1列表示起始IP,第2列表示计数)

^{pr2}$

简短描述

  • 90.1.0.090.1.4.0(total count=1024 * 1 = 1024

  • 90.1.4.090.1.8.0(total count=1024 * 2 = 2048)之间有1024个ip,就像wise

  • 90.1.36.090.1.40.0(total count=1024 * 11 = 11264

  • 因为我们需要计数12000,(12000 - 11264 = 736)将需要在最后一个ip范围内,即90.1.40.0 to 90.1.44.0

其他样本

输入:

ip = 90.1.0.0
count = 32

输出:

90.1.0.0 32

你能建议一下怎么做吗?我是新来的堆栈溢出,所以请指导我,如果我错过了什么。在

提前谢谢!在


Tags: toip列表堆栈count方式建议total
3条回答

您可以尝试以下代码:

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

IP转换代码取自here。在

from_string函数也可以写如下:

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

和to_string函数:

^{pr2}$

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

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)

相关问题 更多 >