PhysicalConnectivity/src/main/java/net/shadowfacts/phycon/api/util/MACAddress.java

87 lines
1.8 KiB
Java

package net.shadowfacts.phycon.api.util;
import org.jetbrains.annotations.NotNull;
import java.util.Random;
/**
* @author shadowfacts
*/
public final class MACAddress {
public enum Type {
BROADCAST, UNICAST, MULTICAST;
}
public static final MACAddress BROADCAST = new MACAddress(0xffffffffffffL);
@NotNull
public static MACAddress random(Random random) {
long value = random.nextLong() & 0xfeffffffffffL;
return new MACAddress(value);
}
private static final Random macAddressRandom = new Random();
@NotNull
public static MACAddress random() {
return random(macAddressRandom);
}
public final long address;
public MACAddress(long address) {
if (address != (address & 0xffffffffffffL)) {
throw new RuntimeException("Invalid MAC address, must be 48 bits.");
}
this.address = address;
}
@NotNull
public MACAddress toUnicast() {
return new MACAddress(address & 0xfeffffffffffL);
}
@NotNull
public MACAddress toMulticast() {
return new MACAddress(address | 0x010000000000L);
}
@NotNull
public Type getType() {
if (this == BROADCAST) {
return Type.BROADCAST;
} else if (((address >> 40) & 1) == 1) {
return Type.MULTICAST;
} else {
return Type.UNICAST;
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MACAddress that = (MACAddress)o;
return address == that.address;
}
@Override
public int hashCode() {
return Long.hashCode(address);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder(17);
for (int i = 5; i >= 0; i--) {
if (i < 5) {
builder.append(':');
}
long octet = (address >> (i * 8)) & 0xff;
builder.append(Long.toHexString(octet));
}
return builder.toString();
}
}