我正在尝试将IP地址范围转换为Java中的CIDR表示法。有人能举个例子说明如何做到这一点吗?
我使用SubnetUtils将CIDR转换为IP地址范围,但我无法找出其他方法。
举例来说:(使用http://ip2cidr.com/)
输入1:5.10.64.0
输入2:5.10.127.255
结果:5.10.64.0/18
我正在尝试将IP地址范围转换为Java中的CIDR表示法。有人能举个例子说明如何做到这一点吗?
我使用SubnetUtils将CIDR转换为IP地址范围,但我无法找出其他方法。
举例来说:(使用http://ip2cidr.com/)
输入1:5.10.64.0
输入2:5.10.127.255
结果:5.10.64.0/18
7条答案
按热度按时间wgx48brx1#
字符串
pobjuy322#
open-source IPAddress Java library可以为您做到这一点。免责声明:我是IPAddress库的项目经理。
下面是示例代码:
字符串
下面是使用IPAddress从原始CIDR字符串生成范围的方法:
型
对于您的示例,我们运行以下代码:
型
输出为:
型
uujelgoq3#
如果你还没有从我的评论中找到答案:
IP数学必须以二进制完成。IP地址和掩码是无符号整数(IPv4为32位,IPv6为128位)。你只需要知道一个地址和面具,你就可以弄清楚其他的一切。
这是您想要实现的算法,适用于IPv4和IPv6。
根据您的问题,您将获得子网(输入1)和最后一个地址(输入2)。
1.从Input 2的无符号整数中减去Input 1的无符号整数。结果是反向子网掩码。反向子网掩码必须是
0
,或者反向子网掩码加上1
必须是2
的幂,否则其中一个输入中有错误(STOP,INPUT ERROR)。1.反向掩码的
NOT
(步骤1的结果)是子网掩码。1.如果Input 1
AND
子网掩码不等于Input 1,则其中一个输入(STOP,INPUT ERROR)中有错误。1.掩码长度(CIDR编号)是子网掩码中
1
位的数量。有几种方法可以计算二进制数中1
的位数,但如果子网掩码是最大整数(或逆掩码为0
),则掩码长度为32
(IPv4)或128
(IPv6)。您可以循环,计算循环次数并向左移动子网掩码,直到它等于0
,循环计算循环次数并向右移动反向掩码,直到它等于0
,然后将1
与总数相加,再从32
(IPv4)或128
(IPv6)中减去总数,或者从32
(IPv4)或128
(IPv6)中减去总逆掩码2
加上1
的幂的指数。1.此时,您已经验证了输入1(子网)、输入2(最后一个地址),并计算了掩码长度(CIDR编号)。
1.最终结果将是
<Input 1>/<Mask Length>
。您的示例:
步骤1(
5.10.127.255 - 5.10.64.0 = 0.0.64.127
):字符串
步骤2(
NOT 0.0.64.255 = 255.255.192.0
是2的幂):型
步骤3(
5.10.64.0 AND 255.255.192.0 = 5.10.64.0
):型
步骤4(
0.0.64.255 + 1 = 0.0.65.0 = 2^14, exponent of 2^14 = 14, 32 - 14 = 18
):型
步骤5(输入1 =
5.10.64.0
,输入2 =5.10.127.255
,掩码长度=18
)第6步(最终结果=
5.10.64.0/18
)fgw7neuy4#
我在这里找到了Java代码:In Java, given an IP Address range, return the minimum list of CIDR blocks that covers the range
字符串
感谢大家的见解和帮助!
pdsfdshx5#
Python中的一些简短而甜蜜的东西:
字符串
vxf3dgd46#
字符串
kiayqfof7#
我们研究了很多,这里是我们如何实现它的最后,只是使用
RouteNotation.fromRange(...)
方法来获得List<RouteNotation>
后,添加下面的类:字符串
注意,这是一个最小需要的副本(没有我们的单元测试和许多帮助器方法),但您可能需要:
型