我想知道是否有公式可以计算出给定范围内IP地址的数量。
我有一个系统,它要么接受一个IP地址,要么接受一个起始和结束IP地址:
145.16.23.241145.16.23.122 - 145.16.23.144输入这些信息的人不是技术人员,他们也没有从技术人员那里得到这些细节,所以建议使用CIDR符号不是我的答案。
我希望能够强调,当输入诸如:122.100.10.12 - 128.10.200.140这样的范围时,它可能实际上不是一个范围,而是2个单一IP地址,因为这样的范围将由x (大量的) IP地址组成。
有没有一个基本的公式来帮助我突出这一点?
发布于 2014-05-29 13:02:08
IP地址是一个32位整数,我们通常表示为人类目的的四个八位数。通过将地址转换为32位整数表示和减法,您可以得到一个范围内的地址数。
发布于 2014-05-29 13:49:49
如果没有任何关于范围是否跨越子网边界和子网是什么的信息,您将无法获得精确的计数。例如,10.10.7.0 - 10.10.8.255是/16上下文中512个地址的连续范围。如果该范围覆盖两个/24块,则计数为508,因为每个块都有一个网络地址和一个广播地址。
确保输入的上界大于或等于下限,并使用减法来测量它们之间的距离,这对于快速检查是否正常是很好的。在你举起红旗之前,你需要决定什么是合理的区别。
在您将每个八进制转换为8位整数之后,将它们转换为单个32位整数是一个问题:
(octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4发布于 2014-05-29 21:58:51
请注意,要正确地将虚线IP地址转换为32位数字并可靠地对其进行处理,您需要使用无符号整数类型。如果您可以使用的唯一整数类型有符号,那么.
另一种计算方法是:从第一个不同的八进制开始,将每个八进制的差值乘以下面的数字,然后将这些差异相加:
1: 16777216
2: 65536
3: 256
4: 1例如,使用您的范围122.100.10.12-128.10.200.140:
128 10 200 140
- 122 100 10 12
= 6 -90 190 128
= 16777216 * 6
+ 65536 * -90
+ 256 * 190
+ 1 * 128
= 94813824的整个转换得到的值是相同的。
0x800AC88C = 2148190348
0x7A640A0C = 2053376524然后减去。
此外,还可以通过以下方式执行相同的操作:
((a[0] - b[0]) * 256 + a[1] - b[1]) * 256 + a[2] - b[2]) * 256 + a[3] - b[3]这很容易受到反复折叠下一对值的reduce的影响。
https://softwareengineering.stackexchange.com/questions/241402
复制相似问题