首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算给定范围内有多少IP地址?

如何计算给定范围内有多少IP地址?
EN

Software Engineering用户
提问于 2014-05-29 11:54:07
回答 4查看 13.5K关注 0票数 4

我想知道是否有公式可以计算出给定范围内IP地址的数量。

我有一个系统,它要么接受一个IP地址,要么接受一个起始和结束IP地址:

  • 一个可能是:145.16.23.241
  • 范围可能是:145.16.23.122 - 145.16.23.144

输入这些信息的人不是技术人员,他们也没有从技术人员那里得到这些细节,所以建议使用CIDR符号不是我的答案。

我希望能够强调,当输入诸如:122.100.10.12 - 128.10.200.140这样的范围时,它可能实际上不是一个范围,而是2个单一IP地址,因为这样的范围将由x (大量的) IP地址组成。

有没有一个基本的公式来帮助我突出这一点?

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2014-05-29 13:02:08

IP地址是一个32位整数,我们通常表示为人类目的的四个八位数。通过将地址转换为32位整数表示和减法,您可以得到一个范围内的地址数。

票数 20
EN

Software Engineering用户

发布于 2014-05-29 13:49:49

如果没有任何关于范围是否跨越子网边界和子网是什么的信息,您将无法获得精确的计数。例如,10.10.7.0 - 10.10.8.255/16上下文中512个地址的连续范围。如果该范围覆盖两个/24块,则计数为508,因为每个块都有一个网络地址和一个广播地址。

确保输入的上界大于或等于下限,并使用减法来测量它们之间的距离,这对于快速检查是否正常是很好的。在你举起红旗之前,你需要决定什么是合理的区别。

在您将每个八进制转换为8位整数之后,将它们转换为单个32位整数是一个问题:

代码语言:javascript
复制
(octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4
票数 12
EN

Software Engineering用户

发布于 2014-05-29 21:58:51

请注意,要正确地将虚线IP地址转换为32位数字并可靠地对其进行处理,您需要使用无符号整数类型。如果您可以使用的唯一整数类型有符号,那么.

另一种计算方法是:从第一个不同的八进制开始,将每个八进制的差值乘以下面的数字,然后将这些差异相加:

代码语言:javascript
复制
1: 16777216
2: 65536
3: 256
4: 1

例如,使用您的范围122.100.10.12-128.10.200.140:

代码语言:javascript
复制
  128  10   200  140
- 122  100   10   12
=   6 -90   190  128

= 16777216 * 6 
+ 65536 * -90
+ 256 * 190
+ 1 * 128
= 94813824

的整个转换得到的值是相同的。

代码语言:javascript
复制
0x800AC88C = 2148190348
0x7A640A0C = 2053376524

然后减去。

此外,还可以通过以下方式执行相同的操作:

代码语言:javascript
复制
((a[0] - b[0]) * 256 + a[1] - b[1]) * 256 + a[2] - b[2]) * 256 + a[3] - b[3]

这很容易受到反复折叠下一对值的reduce的影响。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/241402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档