87 lines
1.8 KiB
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();
|
|
}
|
|
|
|
}
|