    001/**
    002 * Copyright (c) 2014 Digi International Inc.,
    003 * All rights not expressly granted are reserved.
    004 *
    005 * This Source Code Form is subject to the terms of the Mozilla Public
    006 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
    007 * You can obtain one at http://mozilla.org/MPL/2.0/.
    008 *
    009 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
    010 * =======================================================================
    011 */
    012package com.digi.xbee.api.utils;
    013
    014/**
    015 * Utility class containing methods to work with hexadecimal values and several
    016 * data type conversions.
    017 */
    018public class HexUtils {
    019
    020        // Constants.
    021        private static final String HEXES = "0123456789ABCDEF";
    022        private static final String HEX_HEADER = "0x";
    023
    024        /**
    025         * Converts the given byte array into an hex string.
    026         *
    027         * @param value Byte array to convert to hex string.
    028         *
    029         * @return Converted byte array to hex string.
    030         *
    031         * @throws NullPointerException if {@code value == null}.
    032         *
    033         * @see #hexStringToByteArray(String)
    034         */
    035        public static String byteArrayToHexString(byte[] value) {
    036                if (value == null )
    037                        throw new NullPointerException("Value to convert cannot be null");
    038                final StringBuilder hex = new StringBuilder(2 * value.length );
    039                for (final byte b : value) {
    040                        hex.append(HEXES.charAt((b & 0xF0) >> 4))
    041                                .append(HEXES.charAt((b & 0x0F)));
    042                }
    043                return hex.toString();
    044        }
    045
    046        /**
    047         * Converts the given byte into an hex string.
    048         *
    049         * @param value Byte to convert to hex string.
    050         *
    051         * @return Converted byte to hex string.
    052         */
    053        public static String byteToHexString(byte value) {
    054                final StringBuilder hex = new StringBuilder(2);
    055                byte b = value;
    056                hex.append(HEXES.charAt((b & 0xF0) >> 4))
    057                        .append(HEXES.charAt((b & 0x0F)));
    058                return hex.toString();
    059        }
    060
    061        /**
    062         * Converts the given hex string into a byte array.
    063         *
    064         * @param value Hex string to convert to byte array.
    065         *
    066         * @return Byte array of the given hex string.
    067         *
    068         * @throws NullPointerException if {@code value == null}.
    069         *
    070         * @see #byteArrayToHexString(byte[])
    071         */
    072        public static byte[] hexStringToByteArray(String value) {
    073                if (value == null)
    074                        throw new NullPointerException("Value to convert cannot be null.");
    075
    076                value = value.trim();
    077                if (value.startsWith(HEX_HEADER))
    078                        value = value.substring((HEX_HEADER).length());
    079                int len = value.length();
    080                if (len % 2 != 0) {
    081                        value = "0" + value;
    082                        len = value.length();
    083                }
    084                byte[] data = new byte[len / 2];
    085                for (int i = 0; i < len; i += 2) {
    086                        data[i / 2] = (byte) ((Character.digit(value.charAt(i), 16) << 4)
    087                                        + Character.digit(value.charAt(i+1), 16));
    088                }
    089                return data;
    090        }
    091
    092        /**
    093         * Checks whether the given parameter is a string or a numeric value.
    094         *
    095         * @param parameter Parameter to check.
    096         *
    097         * @return {@code true} if the given parameter is a string,
    098         *         {@code false} otherwise.
    099         *
    100         * @throws NullPointerException if {@code parameter == null}.
    101         */
    102        public static boolean containsLetters(String parameter) {
    103                if (parameter == null)
    104                        throw new NullPointerException("Parameter cannot be null.");
    105
    106                byte[] byteArray = parameter.getBytes();
    107                for (int i = 0; i < byteArray.length; i++){
    108                        if (!((byteArray[i] >= '0') && (byteArray[i] <= '9')))
    109                                return true;
    110                }
    111                return false;
    112        }
    113
    114        /**
    115         * Converts the given integer into an hexadecimal string.
    116         *
    117         * @param value The integer value to convert to hexadecimal string.
    118         * @param minBytes The minimum number of bytes to be represented.
    119         *
    120         * @return The integer value as hexadecimal string.
    121         */
    122        public static String integerToHexString(int value, int minBytes) {
    123                byte[] intAsByteArray = ByteUtils.intToByteArray(value);
    124                String intAsHexString = "";
    125                boolean numberFound = false;
    126                for (int i = 0; i < intAsByteArray.length; i++) {
    127                        if (intAsByteArray[i] == 0x00 && !numberFound && intAsByteArray.length - i > minBytes)
    128                                continue;
    129                        intAsHexString += HexUtils.byteArrayToHexString(new byte[] {(byte)(intAsByteArray[i] & 0xFF)});
    130                        numberFound = true;
    131                }
    132                return intAsHexString;
    133        }
    134
    135        /**
    136         * Converts the given hexadecimal string to a pretty format by splitting the
    137         * content byte by byte.
    138         *
    139         * @param hexString The hexadecimal string to convert.
    140         *
    141         * @return The hexadecimal string with pretty format.
    142         *
    143         * @throws NullPointerException if {@code hexString == null}.
    144         *
    145         * @see #prettyHexString(byte[])
    146         */
    147        public static String prettyHexString(String hexString) {
    148                if (hexString == null)
    149                        throw new NullPointerException("Hexadecimal string cannot be null.");
    150
    151                String prettyHexString = "";
    152                if (hexString.length() % 2 != 0)
    153                        hexString = "0" + hexString;
    154                int iterations = hexString.length() / 2;
    155                for (int i = 0; i < iterations; i++)
    156                        prettyHexString += hexString.substring(2 * i, 2 * i + 2) + " ";
    157                return prettyHexString.trim();
    158        }
    159
    160        /**
    161         * Converts the given byte array into an hex string and retrieves it
    162         * in pretty format by splitting the content byte by byte.
    163         *
    164         * @param value The byte array to convert to pretty hex string.
    165         *
    166         * @return The hexadecimal pretty string.
    167         *
    168         * @throws NullPointerException if {@code value == null}.
    169         *
    170         * @see #prettyHexString(String)
    171         */
    172        public static String prettyHexString(byte[] value) {
    173                return prettyHexString(byteArrayToHexString(value));
    174        }
    175}