package org.opendaylight.openflowplugin.openflow.md.util;
import java.math.BigInteger;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.List;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import com.google.common.base.Preconditions;
+import com.google.common.io.BaseEncoding;
-import com.google.common.base.Joiner;
-
-/**
- * @author mirehak
- *
- */
public abstract class ByteUtil {
- private static final int MAC_ADDRESS_LENGTH = 6;
+ /** default hex string separator */
+ private static final String DEFAULT_HEX_SEPARATOR = ":";
+ /** basic hex string encoding */
+ private static final BaseEncoding PLAIN_HEX_16_ENCODING = BaseEncoding.base16().lowerCase();
+ /** hex string encoding involving {@link #DEFAULT_HEX_SEPARATOR} as searator */
+ private static final BaseEncoding HEX_16_ENCODING = PLAIN_HEX_16_ENCODING.withSeparator(DEFAULT_HEX_SEPARATOR, 2);
+
/**
- * @param bytes
- * @param delimiter
+ * @param bytes bytes that needs to be converted to hex
+ * @param delimiter string delimiter
* @return hexString containing bytes, separated with delimiter
*/
- public static String bytesToHexstring(byte[] bytes, String delimiter) {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < bytes.length; i++) {
- byte b = bytes[i];
- sb.append(String.format("%02x%s", b, delimiter));
+ public static String bytesToHexstring(final byte[] bytes, final String delimiter) {
+ BaseEncoding be = HEX_16_ENCODING;
+ if (delimiter != DEFAULT_HEX_SEPARATOR) {
+ be = PLAIN_HEX_16_ENCODING.withSeparator(delimiter, 2);
}
- return sb.toString();
+ return be.encode(bytes);
}
/**
* Utility method to convert BigInteger to n element byte array
- * @param bigInteger
+ *
+ * @param bigInteger big integer value that needs to be converted to byte
+ * @param numBytes convert to number of bytes
* @return byte array containing n * 8 bits.
*/
- public static byte[] convertBigIntegerToNBytes(BigInteger bigInteger, int numBytes) {
+ public static byte[] convertBigIntegerToNBytes(final BigInteger bigInteger, final int numBytes) {
if (bigInteger == null) {
return null;
}
Arrays.fill(outputArray, (byte) 0);
}
System.arraycopy(inputArray,
- Math.max(0, inputArray.length - outputArray.length),
- outputArray,
- Math.max(0, outputArray.length - inputArray.length),
- Math.min(outputArray.length, inputArray.length));
+ Math.max(0, inputArray.length - outputArray.length),
+ outputArray,
+ Math.max(0, outputArray.length - inputArray.length),
+ Math.min(outputArray.length, inputArray.length));
return outputArray;
}
/**
* Converts a 4 byte array of unsigned bytes to unsigned int
+ *
+ * @param bytes an array of 4 unsigned bytes
+ * @return a long representing the unsigned int
+ */
+ public static final long bytesToUnsignedInt(final byte[] bytes) {
+ Preconditions.checkArgument(bytes.length == 4, "Input byte array must be exactly four bytes long.");
+ long unsignedInt = 0;
+ unsignedInt |= bytes[0] & 0xFF;
+ unsignedInt <<= 8;
+ unsignedInt |= bytes[1] & 0xFF;
+ unsignedInt <<= 8;
+ unsignedInt |= bytes[2] & 0xFF;
+ unsignedInt <<= 8;
+ unsignedInt |= bytes[3] & 0xFF;
+ return unsignedInt;
+ }
+
+ /**
+ * Converts a 3 byte array of unsigned bytes to unsigned int
+ *
* @param bytes an array of 4 unsigned bytes
* @return a long representing the unsigned int
*/
- public static final long bytesToUnsignedInt(byte[] bytes)
- {
- long unsignedInt = 0;
- unsignedInt |= bytes[0] & 0xFF;
- unsignedInt <<= 8;
- unsignedInt |= bytes[1] & 0xFF;
- unsignedInt <<= 8;
- unsignedInt |= bytes[2] & 0xFF;
- unsignedInt <<= 8;
- unsignedInt |= bytes[3] & 0xFF;
- return unsignedInt;
+ public static final long bytesToUnsignedMedium(final byte[] bytes) {
+ Preconditions.checkArgument(bytes.length == 3, "Input byte array must be exactly three bytes long.");
+ long unsignedMedium = 0;
+ unsignedMedium |= bytes[0] & 0xFF;
+ unsignedMedium <<= 8;
+ unsignedMedium |= bytes[1] & 0xFF;
+ unsignedMedium <<= 8;
+ unsignedMedium |= bytes[2] & 0xFF;
+ return unsignedMedium;
}
/**
* Converts a 2 byte array of unsigned bytes to unsigned short
+ *
* @param bytes an array of 2 unsigned bytes
* @return an int representing the unsigned short
*/
- public static final int bytesToUnsignedShort(byte[] bytes)
- {
- int unsignedShort = 0;
- unsignedShort |= bytes[0] & 0xFF;
- unsignedShort <<= 8;
- unsignedShort |= bytes[1] & 0xFF;
- return unsignedShort;
+ public static final int bytesToUnsignedShort(final byte[] bytes) {
+ Preconditions.checkArgument(bytes.length == 2, "Input byte array must be exactly two bytes long.");
+ int unsignedShort = 0;
+ unsignedShort |= bytes[0] & 0xFF;
+ unsignedShort <<= 8;
+ unsignedShort |= bytes[1] & 0xFF;
+ return unsignedShort;
}
/**
* Converts unsigned integer to a 4 byte array of unsigned bytes
+ *
* @param unsignedInt representing the unsigned integer
* @return bytes an array of 4 unsigned bytes
*/
- public static byte[] unsignedIntToBytes(Long unsignedInt)
- {
- byte[] bytes = new byte[4];
- bytes[3] = (byte) (unsignedInt & 0xFF);
- bytes[2] = (byte) ((unsignedInt >> 8) & 0xFF);
- bytes[1] = (byte) ((unsignedInt >> 16) & 0xFF);
- bytes[0] = (byte) ((unsignedInt >> 24) & 0xFF);
- return bytes;
- }
-
- /**
- * Converts unsigned short to a 2 byte array of unsigned bytes
- * @param unsignedShort representing the unsigned short
- * @return bytes an array of 2 unsigned bytes
- */
- public static byte[] unsignedShortToBytes(Integer unsignedShort)
- {
- byte[] bytes = new byte[2];
- bytes[1] = (byte) (unsignedShort & 0xFF);
- bytes[0] = (byte) ((unsignedShort >> 8) & 0xFF);
- return bytes;
+ public static byte[] unsignedIntToBytes(final Long unsignedInt) {
+ byte[] bytes = new byte[4];
+ bytes[3] = (byte) (unsignedInt & 0xFF);
+ bytes[2] = (byte) ((unsignedInt >> 8) & 0xFF);
+ bytes[1] = (byte) ((unsignedInt >> 16) & 0xFF);
+ bytes[0] = (byte) ((unsignedInt >> 24) & 0xFF);
+ return bytes;
}
/**
- * Converts mac address represented in bytes to String
- * @param address
- * @return String representation of mac address
- * @see {@link MacAddress}
+ * Converts unsigned integer to a 3 byte array of unsigned bytes
+ *
+ * @param unsignedInt representing the unsigned integer
+ * @return bytes an array of 3 unsigned bytes
*/
- public static String macAddressToString(byte[] address) {
- List<String> groups = new ArrayList<>();
- for(int i=0; i < MAC_ADDRESS_LENGTH; i++){
- groups.add(String.format("%02X", address[i]));
- }
- Joiner joiner = Joiner.on(":");
- return joiner.join(groups);
+ public static byte[] unsignedMediumToBytes(final Long unsignedInt) {
+ byte[] bytes = new byte[3];
+ bytes[2] = (byte) (unsignedInt & 0xFF);
+ bytes[1] = (byte) ((unsignedInt >> 8) & 0xFF);
+ bytes[0] = (byte) ((unsignedInt >> 16) & 0xFF);
+ return bytes;
}
/**
- * Converts macAddress to byte array
- * @param macAddress
- * @return byte representation of mac address
- * @see {@link MacAddress}
+ * Converts unsigned short to a 2 byte array of unsigned bytes
+ *
+ * @param unsignedShort representing the unsigned short
+ * @return bytes an array of 2 unsigned bytes
*/
- public static byte[] macAddressToBytes(MacAddress macAddress) {
- String macAddressString = macAddress.getValue();
- String[] sequences = macAddressString.split(":");
- int MAC_ADDRESS_LENGTH = 6;
- byte[] result = new byte[MAC_ADDRESS_LENGTH];
- for (int i = 0; i < sequences.length; i++) {
- result[i] = (byte) Short.parseShort(sequences[i], 16);
- }
- return result;
+ public static byte[] unsignedShortToBytes(final Integer unsignedShort) {
+ byte[] bytes = new byte[2];
+ bytes[1] = (byte) (unsignedShort & 0xFF);
+ bytes[0] = (byte) ((unsignedShort >> 8) & 0xFF);
+ return bytes;
}
}