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))
}
如何优化?