1

我有一个起始 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.0范围到90.1.4.0(总数 = 1024 * 1 = 1024)之间将有 1024 个 ips

  • 90.1.4.0范围到90.1.8.0(总计数 = )之间将有 1024 个 ips 1024 * 2 = 2048,同样明智

  • 范围90.1.36.090.1.40.0(总数=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

你能建议如何进行吗?我是 Stack Overflow 的新手,所以如果我遗漏了什么,请指导我。

提前致谢!

4

3 回答 3

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

IP 转换代码取自这里

于 2013-09-29T20:04:48.650 回答
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)
于 2013-09-29T20:35:24.040 回答
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

于 2013-09-30T19:47:47.780 回答