/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.converter.crypto; /** * <code>HexUtils</code> provides utility methods for hex conversions */ public final class HexUtils { private static char hexChars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; private HexUtils() { } /** * Creates a string representation of the supplied byte array in Hexidecimal * format * * @param in the byte array to convert to a hex string. * @param start where to begin in the array * @param length how many bytes from the array to include in the hexidecimal * representation * @return a string containing the hexidecimal representation of the * requested bytes from the array */ public static String byteArrayToHexString(byte in[], int start, int length) { String asHexString = null; if (in != null) { StringBuilder out = new StringBuilder(in.length * 2); for (int x = start; x < length; x++) { int nybble = in[x] & 0xF0; nybble = nybble >>> 4; out.append(hexChars[nybble]); out.append(hexChars[in[x] & 0x0F]); } asHexString = out.toString(); } return asHexString; } /** * Creates a string representation of the supplied byte array in Hexidecimal * format * * @param in the byte array to convert to a hex string. * @return a string containing the hexidecimal representation of the array */ public static String byteArrayToHexString(byte in[]) { return byteArrayToHexString(in, 0, in.length); } /** * Convert a hex string into an array of bytes. The string is expected to * consist entirely of valid Hex characters i.e. 0123456789abcdefABCDEF. The * array is calculated by traversing the string from from left to right, * ignoring whitespace. Every 2 valid hex chars will constitute a new byte * for the array. If the string is uneven then it the last byte will be * padded with a '0'. * * @param hexString String to be converted */ public static byte[] hexToByteArray(String hexString) { StringBuilder normalize = new StringBuilder(hexString.length()); for (int x = 0; x < hexString.length(); x++) { char current = Character.toLowerCase(hexString.charAt(x)); if (isHexChar(current)) { normalize.append(current); } else if (!Character.isWhitespace(current)) { throw new IllegalStateException(String.format("Conversion of hex string to array failed. '%c' is not a valid hex character", current)); } } // pad with a zero if we have an uneven number of characters. if (normalize.length() % 2 > 0) { normalize.append('0'); } byte[] hexArray = new byte[hexString.length() + 1 >> 1]; for (int x = 0; x < hexArray.length; x++) { int ni = x << 1; int mostSignificantNybble = Character.digit(normalize.charAt(ni), 16); int leastSignificantNybble = Character.digit(normalize.charAt(ni + 1), 16); int value = ((mostSignificantNybble << 4)) | (leastSignificantNybble & 0x0F); hexArray[x] = (byte)value; } return hexArray; } public static boolean isHexChar(char current) { return Character.digit(current, 16) >= 0; } }