blob: 2431b8b5dbb7053b4ac2d0f39f3c9ac6a3fd4b3a [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial Implementation
*
*****************************************************************************/
package org.eclipse.ptp.remotetools.utils.network;
import java.math.BigInteger;
/**
* Class that represents a
*
* @author Richard Maciel
* @since 3.0
*/
public class MacAddress {
public static int MAX_BITS = 48;
public static int HEXDIGITS = MAX_BITS/4;
public static int HEXBASE = 16;
BigInteger mac;
private MacAddress() {
}
/**
* Creatre a MacAddress from a {@link String}.
*
* If the string is not in the XX:XX:XX:XX:XX:XX format, where XX is two hexadecimal digits, then
* a MacAddressFormatException is raised.
*
* @param macString
* @return
* @throws MacAddressFormatException
*/
public static MacAddress createMacAddress(String macString) throws MacAddressFormatException {
MacAddress maddr = new MacAddress();
maddr.mac = convertStringToInternalRepresentation(macString);
return maddr;
}
/**
* Create a Mac Address from a {@link BigInteger}.
*
* If the number is negative, it will be converted to a positive one.
* If the number cannot be represented with MAX_BITS, then get the MAX_BITS least significant bits
*
* @param macNumber
*/
public static MacAddress createMacAddress(BigInteger macNumber) {
MacAddress maddr = new MacAddress();
maddr.mac = convertBigIntegerToInternalRepresentation(macNumber);
return maddr;
}
private static BigInteger convertBigIntegerToInternalRepresentation(BigInteger macNumber) {
if(macNumber.signum() < 0) {
// macNumber cannot be negative. Set it to a positive number
macNumber = macNumber.negate();
}
if(macNumber.bitLength() > MAX_BITS) {
// Mac number cannot be greater than 2 ^48, then convert to a 48 bit number
String bigMacStr = macNumber.toString(HEXBASE);
String macStr = bigMacStr.substring(bigMacStr.length()-1 - HEXDIGITS, bigMacStr.length() - 1);
macNumber = new BigInteger(macStr);
}
return macNumber;
}
private static BigInteger convertStringToInternalRepresentation(String macString) throws MacAddressFormatException {
String trimmedMacString = macString.trim();
boolean isValidMac = trimmedMacString.matches("^(\\p{XDigit}{2}:){5}\\p{XDigit}{2}$"); //$NON-NLS-1$
if(!isValidMac) {
throw new MacAddressFormatException(Messages.MacAddress_InvalidMACAddressFormat);
}
// Remove all ':' from the String
String validMacString = trimmedMacString.replaceAll(":", ""); //replace(':', '\0'); //$NON-NLS-1$//$NON-NLS-2$
// Convert to the internal representation
return new BigInteger(validMacString, HEXBASE);
}
public void setValue(BigInteger macNumber) {
mac = MacAddress.convertBigIntegerToInternalRepresentation(macNumber);
}
public void setValue(String macString) throws MacAddressFormatException {
mac = convertStringToInternalRepresentation(macString);
}
public BigInteger getBigIntegerRepresentation() {
return mac;
}
/**
* Return a string representation of the mac address
*
* @return String containing the mac address representation
*/
public String getStringRepresentation() {
String strRep = mac.toString(HEXBASE);
// Add the 0 at the left to complete the string.
if(strRep.length() < HEXDIGITS) {
StringBuffer zeroStr = new StringBuffer();
for(int i=0; i < (HEXDIGITS - strRep.length()); i++) {
zeroStr.append("0"); //$NON-NLS-1$
}
strRep = new String(zeroStr + strRep);
}
// For each pair of character, add a : character, except for the last one
StringBuffer hexRep = new StringBuffer();
for(int i=0; i < HEXDIGITS - 2; i = i + 2) {
hexRep.append(strRep.substring(i, i+2) + ":"); //$NON-NLS-1$
}
hexRep.append(strRep.substring(HEXDIGITS-2, HEXDIGITS));
return hexRep.toString();
}
}