为IPv6实现SubnetUtils的“ isInRange”方法的最佳方法是什么

时间:2019-05-06 17:26:38

标签: scala apache ipv6 cidr inetaddress

Apache SubnetUtils不支持IPv6 CIDR。实施isInRange之类的等效方法并获得Java / scala中Ivv6地址范围的地址范围中的第一个和最后一个IP的最佳方法是什么?

在示例中:

如果IPv6地址范围是ff00 :: / 8,则需要计算ff00 ::作为范围内的第一个IP,并将ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff作为范围内的最后一个IP。

以下是获取IP的最初实现(我需要将其作为BigInteger):

private def findFirstAndLastIP(addressPrefix: String): (BigInteger, BigInteger) = {
    val adrressPrefixComponents: Array[String] = addressPrefix.split("/")
    if(adrressPrefixComponents.length != 2) {
      (BigInteger.ZERO, BigInteger.ZERO)
    }

    val ipBytes: Array[Byte] = InetAddress.getByName(adrressPrefixComponents(0)).getAddress()
    var mask: Int = ipBytes.length*8 - adrressPrefixComponents(1).toInt

    var firstIp: Array[Byte] = ipBytes.clone()
    var lastIp: Array[Byte] = ipBytes.clone()
    var byteIndexToUpdate: Int = ipBytes.length - 1

    while(mask > 0) {
      var setBits = (1<<Math.min(mask,8)) - 1
      lastIp(byteIndexToUpdate) = (lastIp(byteIndexToUpdate).|(setBits)).toByte
      firstIp(byteIndexToUpdate) = (firstIp(byteIndexToUpdate).&(255 -  setBits)).toByte
      byteIndexToUpdate = byteIndexToUpdate-1  
      mask = mask-8
    }   
    (new BigInteger(firstIp), new BigInteger(lastIp))
}

如何优化?

0 个答案:

没有答案