我有起始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个ips(总计数= 1024 * 1 = 1024
)
90.1.4.0
到90.1.8.0
(总计数= 1024 * 2 = 2048
)之间会有1024个ips,明智的
90.1.36.0
到90.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的新手,所以如果我错过了什么,请指导我。
提前致谢!
答案 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