/* * This file is part of jsFlow. * * Copyright (c) 2009 DE-CIX Management GmbH <http://www.de-cix.net> - All rights * reserved. * * Author: Thomas King <thomas.king@de-cix.net> * * This software is licensed under the Apache License, version 2.0. A copy of * the license agreement is included in this distribution. */ package net.decix.util; import java.util.StringTokenizer; public class MacAddress { private int firstOctet; private int secondOctet; private int thirdOctet; private int fourthOctet; private int fifthOctet; private int sixthOctet; public MacAddress() { } public MacAddress(String address) throws UtilityException { StringTokenizer st = new StringTokenizer(address, ":"); if (st.countTokens() != 6) { throw new UtilityException("6 octets in a MAC address string are required."); } int i = 0; while (st.hasMoreTokens()) { int temp = Integer.parseInt(st.nextToken(), 16); if ((temp < 0) || (temp > 255)) { throw new UtilityException("Address is in incorrect format."); } switch (i) { case 0: firstOctet = temp; ++i; break; case 1: secondOctet = temp; ++i; break; case 2: thirdOctet = temp; ++i; break; case 3: fourthOctet = temp; ++i; break; case 4: fifthOctet = temp; ++i; break; case 5: sixthOctet = temp; ++i; break; } } } public MacAddress(byte[] address) throws UtilityException { if (address.length < 6) { throw new UtilityException("6 bytes are required."); } firstOctet = Utility.oneByteToInteger(address[0]); secondOctet = Utility.oneByteToInteger(address[1]); thirdOctet = Utility.oneByteToInteger(address[2]); fourthOctet = Utility.oneByteToInteger(address[3]); fifthOctet = Utility.oneByteToInteger(address[4]); sixthOctet = Utility.oneByteToInteger(address[5]); } public String toString() { return Utility.prependZeroIfNeededForMacAddress(Integer.toHexString(firstOctet)) + ":" + Utility.prependZeroIfNeededForMacAddress(Integer.toHexString(secondOctet)) + ":" + Utility.prependZeroIfNeededForMacAddress(Integer.toHexString(thirdOctet)) + ":" + Utility.prependZeroIfNeededForMacAddress(Integer.toHexString(fourthOctet)) + ":" + Utility.prependZeroIfNeededForMacAddress(Integer.toHexString(fifthOctet)) + ":" + Utility.prependZeroIfNeededForMacAddress(Integer.toHexString(sixthOctet)); } public byte[] getBytes() throws UtilityException { byte[] result = new byte[6]; result[0] = Utility.integerToOneByte(firstOctet); result[1] = Utility.integerToOneByte(secondOctet); result[2] = Utility.integerToOneByte(thirdOctet); result[3] = Utility.integerToOneByte(fourthOctet); result[4] = Utility.integerToOneByte(fifthOctet); result[5] = Utility.integerToOneByte(sixthOctet); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MacAddress other = (MacAddress) obj; if (firstOctet != other.firstOctet) return false; if (secondOctet != other.secondOctet) return false; if (thirdOctet != other.thirdOctet) return false; if (fourthOctet != other.fourthOctet) return false; if (fifthOctet != other.fifthOctet) return false; if (sixthOctet != other.sixthOctet) return false; return true; } @Override public int hashCode() { return (firstOctet << 40) + (secondOctet << 32) + (thirdOctet << 24) + (fourthOctet << 16) + (fifthOctet << 8) + (sixthOctet); } }