/** * Construct an IPv6Address from two longs representing the 64 highest and 64 lowest bits. It is usually easier to construct * IPv6Addresses from a {@link String} or an {@link java.net.InetAddress}. The internal representation of an IPv6Address is exactly * these two longs though, so if you already happen to have them, this provides a very efficient way to construct an IPv6Address. * * @param highBits highest order bits * @param lowBits lowest order bits * @return ipv6 address constructed from two longs */ public static IPv6Address fromLongs(long highBits, long lowBits) { return new IPv6Address(highBits, lowBits); }
/** * Construct an IPv6Address from two longs representing the 64 highest and 64 lowest bits. It is usually easier to construct * IPv6Addresses from a {@link String} or an {@link java.net.InetAddress}. The internal representation of an IPv6Address is exactly * these two longs though, so if you already happen to have them, this provides a very efficient way to construct an IPv6Address. * * @param highBits highest order bits * @param lowBits lowest order bits * @return ipv6 address constructed from two longs */ public static IPv6Address fromLongs(long highBits, long lowBits) { return new IPv6Address(highBits, lowBits); }
public IPv6Address asAddress() { if (prefixLength == 128) { return new IPv6Address(0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL); } else if (prefixLength == 64) { return new IPv6Address(0xFFFFFFFFFFFFFFFFL, 0L); } else if (prefixLength > 64) { final int remainingPrefixLength = prefixLength - 64; return new IPv6Address(0xFFFFFFFFFFFFFFFFL, (0xFFFFFFFFFFFFFFFFL << (64 - remainingPrefixLength))); } else if (prefixLength == 0) { return new IPv6Address(0, 0); } else { return new IPv6Address(0xFFFFFFFFFFFFFFFFL << (64 - prefixLength), 0); } }
public IPv6Address asAddress() { if (prefixLength == 128) { return new IPv6Address(0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL); } else if (prefixLength == 64) { return new IPv6Address(0xFFFFFFFFFFFFFFFFL, 0L); } else if (prefixLength > 64) { final int remainingPrefixLength = prefixLength - 64; return new IPv6Address(0xFFFFFFFFFFFFFFFFL, (0xFFFFFFFFFFFFFFFFL << (64 - remainingPrefixLength))); } else if (prefixLength == 0) { return new IPv6Address(0, 0); } else { return new IPv6Address(0xFFFFFFFFFFFFFFFFL << (64 - prefixLength), 0); } }
/** * Set a bit in the address. * * @param bit to set (in the range [0, 127]) * @return an address with the given bit set */ public IPv6Address setBit(final int bit) { if (bit < 0 || bit > 127) throw new IllegalArgumentException("can only set bits in the interval [0, 127]"); if (bit < 64) { return new IPv6Address(this.highBits, this.lowBits | (1L << bit)); } else { return new IPv6Address(this.highBits | (1L << (bit - 64)), this.lowBits); } }
/** * Set a bit in the address. * * @param bit to set (in the range [0, 127]) * @return an address with the given bit set */ public IPv6Address setBit(final int bit) { if (bit < 0 || bit > 127) throw new IllegalArgumentException("can only set bits in the interval [0, 127]"); if (bit < 64) { return new IPv6Address(this.highBits, this.lowBits | (1L << bit)); } else { return new IPv6Address(this.highBits | (1L << (bit - 64)), this.lowBits); } }
public int numberOfLeadingOnes() { // count leading ones in "value" by counting leading zeroes in "~ value" final IPv6Address flipped = new IPv6Address(~this.highBits, ~this.lowBits); return flipped.numberOfLeadingZeroes(); }
public int numberOfLeadingOnes() { // count leading ones in "value" by counting leading zeroes in "~ value" final IPv6Address flipped = new IPv6Address(~this.highBits, ~this.lowBits); return flipped.numberOfLeadingZeroes(); }
static IPv6Address mergeLongArrayIntoIPv6Address(long[] longs) { long high = 0L; long low = 0L; for (int i = 0; i < longs.length; i++) { if (inHighRange(i)) high |= (longs[i] << ((4 - i - 1) * 16)); else low |= (longs[i] << ((4 - i - 1) * 16)); } return new IPv6Address(high, low); }
static IPv6Address mergeLongArrayIntoIPv6Address(long[] longs) { long high = 0L; long low = 0L; for (int i = 0; i < longs.length; i++) { if (inHighRange(i)) high |= (longs[i] << ((4 - i - 1) * 16)); else low |= (longs[i] << ((4 - i - 1) * 16)); } return new IPv6Address(high, low); }
return new IPv6Address(highBits - 1, newLowBits); return new IPv6Address(highBits, newLowBits); return new IPv6Address(highBits + 1, newLowBits); return new IPv6Address(highBits, newLowBits);
return new IPv6Address(highBits + 1, newLowBits); return new IPv6Address(highBits, newLowBits); return new IPv6Address(highBits - 1, newLowBits); return new IPv6Address(highBits, newLowBits);
return new IPv6Address(highBits - 1, newLowBits); return new IPv6Address(highBits, newLowBits); return new IPv6Address(highBits + 1, newLowBits); return new IPv6Address(highBits, newLowBits);
/** * Create an IPv6 address from a byte array. * * @param bytes byte array with 16 bytes (interpreted unsigned) * @return IPv6 address */ public static IPv6Address fromByteArray(final byte[] bytes) { if (bytes == null) throw new IllegalArgumentException("can not construct from [null]"); if (bytes.length != N_BYTES) throw new IllegalArgumentException("the byte array to construct from should be 16 bytes long"); ByteBuffer buf = ByteBuffer.allocate(N_BYTES); for (byte b : bytes) { buf.put(b); } buf.rewind(); LongBuffer longBuffer = buf.asLongBuffer(); return new IPv6Address(longBuffer.get(), longBuffer.get()); }
return new IPv6Address(highBits + 1, newLowBits); return new IPv6Address(highBits, newLowBits); return new IPv6Address(highBits - 1, newLowBits); return new IPv6Address(highBits, newLowBits);
/** * Create an IPv6 address from a byte array. * * @param bytes byte array with 16 bytes (interpreted unsigned) * @return IPv6 address */ public static IPv6Address fromByteArray(final byte[] bytes) { if (bytes == null) throw new IllegalArgumentException("can not construct from [null]"); if (bytes.length != N_BYTES) throw new IllegalArgumentException("the byte array to construct from should be 16 bytes long"); ByteBuffer buf = ByteBuffer.allocate(N_BYTES); for (byte b : bytes) { buf.put(b); } buf.rewind(); LongBuffer longBuffer = buf.asLongBuffer(); return new IPv6Address(longBuffer.get(), longBuffer.get()); }
return new IPv6Address(this.highBits, 0); return new IPv6Address(0, 0); return new IPv6Address(this.highBits, this.lowBits & (0xFFFFFFFFFFFFFFFFL << (64 - remainingPrefixLength))); return new IPv6Address(this.highBits & (0xFFFFFFFFFFFFFFFFL << (64 - networkMask.asPrefixLength())), 0);
return new IPv6Address(this.highBits, 0); return new IPv6Address(0, 0); return new IPv6Address(this.highBits, this.lowBits & (0xFFFFFFFFFFFFFFFFL << (64 - remainingPrefixLength))); return new IPv6Address(this.highBits & (0xFFFFFFFFFFFFFFFFL << (64 - networkMask.asPrefixLength())), 0);
/** * Calculate the maximum address with the given network mask. * * @param networkMask network mask * @return an address of which the last 128 - networkMask.asPrefixLength() bits are one */ public IPv6Address maximumAddressWithNetworkMask(final IPv6NetworkMask networkMask) { if (networkMask.asPrefixLength() == 128) { return this; } else if (networkMask.asPrefixLength() == 64) { return new IPv6Address(this.highBits, 0xFFFFFFFFFFFFFFFFL); } else if (networkMask.asPrefixLength() > 64) { // apply mask on low bits only final int remainingPrefixLength = networkMask.asPrefixLength() - 64; return new IPv6Address(this.highBits, this.lowBits | (0xFFFFFFFFFFFFFFFFL >>> remainingPrefixLength)); } else { // apply mask on high bits, low bits completely 1 return new IPv6Address(this.highBits | (0xFFFFFFFFFFFFFFFFL >>> networkMask.asPrefixLength()), 0xFFFFFFFFFFFFFFFFL); } }
/** * Calculate the maximum address with the given network mask. * * @param networkMask network mask * @return an address of which the last 128 - networkMask.asPrefixLength() bits are one */ public IPv6Address maximumAddressWithNetworkMask(final IPv6NetworkMask networkMask) { if (networkMask.asPrefixLength() == 128) { return this; } else if (networkMask.asPrefixLength() == 64) { return new IPv6Address(this.highBits, 0xFFFFFFFFFFFFFFFFL); } else if (networkMask.asPrefixLength() > 64) { // apply mask on low bits only final int remainingPrefixLength = networkMask.asPrefixLength() - 64; return new IPv6Address(this.highBits, this.lowBits | (0xFFFFFFFFFFFFFFFFL >>> remainingPrefixLength)); } else { // apply mask on high bits, low bits completely 1 return new IPv6Address(this.highBits | (0xFFFFFFFFFFFFFFFFL >>> networkMask.asPrefixLength()), 0xFFFFFFFFFFFFFFFFL); } }