@SuppressWarnings("magicNumber")
    public static byte[] decode(char[] data) throws IllegalArgumentException {

        int len = data.length;

        if ((len & 0x01) != 0) {
            throw new IllegalArgumentException("Odd number of characters.");
        }

        byte[] out = new byte[len >> 1];

        // two characters form the hex value.
        for (int i = 0, j = 0; j < len; i++) {
            int f = toDigit(data[j], j) << 4;
            j++;
            f = f | toDigit(data[j], j);
            j++;
            out[i] = (byte) (f & 0xFF);
        }

        return out;
    }
Converts an array of characters representing hexadecimal values into an
array of bytes of those same values. The returned array will be half the
length of the passed array, as it takes two characters to represent any
given byte. An exception is thrown if the passed char array has an odd
number of elements.

@param data An array of characters containing hexadecimal digits
@return A byte array containing binary data decoded from
the supplied char array.
@throws IllegalArgumentException if an odd number or illegal of characters
                                 is supplied
lang/src/main/java/org/apache/shiro/lang/codec/Hex.java