| /* |
| * 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.tika.mime; |
| |
| /** |
| * |
| * A set of Hex encoding and decoding utility methods. |
| * |
| */ |
| public class HexCoDec { |
| |
| private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', |
| '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; |
| |
| /** |
| * Decode a hex string |
| * |
| * @param hexValue |
| * the string of hex characters |
| * @return the decode hex string as bytes. |
| */ |
| public static byte[] decode(String hexValue) { |
| return decode(hexValue.toCharArray()); |
| } |
| |
| /** |
| * Decode an array of hex chars |
| * |
| * @param hexChars |
| * an array of hex characters. |
| * @return the decode hex chars as bytes. |
| */ |
| public static byte[] decode(char[] hexChars) { |
| return decode(hexChars, 0, hexChars.length); |
| } |
| |
| /** |
| * Decode an array of hex chars. |
| * |
| * @param hexChars |
| * an array of hex characters. |
| * @param startIndex |
| * the index of the first character to decode |
| * @param length |
| * the number of characters to decode. |
| * @return the decode hex chars as bytes. |
| */ |
| public static byte[] decode(char[] hexChars, int startIndex, int length) { |
| if ((length & 1) != 0) |
| throw new IllegalArgumentException("Length must be even"); |
| |
| byte[] result = new byte[length / 2]; |
| for (int j = 0; j < result.length; j++) { |
| result[j] = (byte) (hexCharToNibble(hexChars[startIndex++]) * 16 + hexCharToNibble(hexChars[startIndex++])); |
| } |
| return result; |
| } |
| |
| /** |
| * Hex encode an array of bytes |
| * |
| * @param bites |
| * the array of bytes to encode. |
| * @return the array of hex characters. |
| */ |
| public static char[] encode(byte[] bites) { |
| return encode(bites, 0, bites.length); |
| } |
| |
| /** |
| * Hex encode an array of bytes |
| * |
| * @param bites |
| * the array of bytes to encode. |
| * @param startIndex |
| * the index of the first character to encode. |
| * @param length |
| * the number of characters to encode. |
| * @return the array of hex characters. |
| */ |
| public static char[] encode(byte[] bites, int startIndex, int length) { |
| char[] result = new char[length * 2]; |
| for (int i = 0, j = 0; i < length; i++) { |
| int bite = bites[startIndex++] & 0xff; |
| result[j++] = HEX_CHARS[bite >> 4]; |
| result[j++] = HEX_CHARS[bite & 0xf]; |
| } |
| return result; |
| } |
| |
| /** |
| * Internal method to turn a hex char into a nibble. |
| */ |
| private static int hexCharToNibble(char ch) { |
| if ((ch >= '0') && (ch <= '9')) { |
| return ch - '0'; |
| } else if ((ch >= 'a') && (ch <= 'f')) { |
| return ch - 'a' + 10; |
| } else if ((ch >= 'A') && (ch <= 'F')) { |
| return ch - 'A' + 10; |
| } else { |
| throw new IllegalArgumentException("Not a hex char - '" + ch + "'"); |
| } |
| } |
| |
| } |