X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fopenflow%2Fmd%2Futil%2FByteUtil.java;h=115c146f29fccd5f7396ab54f0216c9782b96e12;hb=6e5df2b3308ffdc906dc1ef84a4ddde37f8080f6;hp=54d95fce20234b63abf415da115d0dd6f9a4fcfd;hpb=58461992e2692fe0faa0746426696279ec9bd1c1;p=openflowplugin.git diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/ByteUtil.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/ByteUtil.java index 54d95fce20..115c146f29 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/ByteUtil.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/ByteUtil.java @@ -8,41 +8,41 @@ 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; } @@ -54,102 +54,103 @@ public abstract class ByteUtil { 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 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; } }