| /** |
| * 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; |
| } |
| |
| } |