1 /* 2 * ==================================================================== 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * ==================================================================== 20 * 21 * This software consists of voluntary contributions made by many 22 * individuals on behalf of the Apache Software Foundation. For more 23 * information on the Apache Software Foundation, please see 24 * <http://www.apache.org/>. 25 * 26 */ 27 28 29 package org.apache.hc.client5.http.utils; 30 31 import org.apache.hc.core5.annotation.Internal; 32 33 @Internal 34 public class Hex { 35 36 private Hex() { 37 } 38 39 public static String encodeHexString(final byte[] bytes) { 40 41 final char[] out = new char[bytes.length * 2]; 42 43 encodeHex(bytes, 0, bytes.length, DIGITS_LOWER, out, 0); 44 return new String(out); 45 } 46 47 // 48 // The following comes from commons-codec 49 // https://github.com/apache/commons-codec/blob/master/src/main/java/org/apache/commons/codec/binary/Hex.java 50 51 /** 52 * Used to build output as hex. 53 */ 54 55 private static final char[] DIGITS_LOWER = { 56 '0', '1', '2', '3', '4', '5', '6', '7', 57 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 58 }; 59 60 /** 61 * Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order. 62 * 63 * @param data a byte[] to convert to hex characters 64 * @param dataOffset the position in {@code data} to start encoding from 65 * @param dataLen the number of bytes from {@code dataOffset} to encode 66 * @param toDigits the output alphabet (must contain at least 16 chars) 67 * @param out a char[] which will hold the resultant appropriate characters from the alphabet. 68 * @param outOffset the position within {@code out} at which to start writing the encoded characters. 69 */ 70 private static void encodeHex(final byte[] data, final int dataOffset, final int dataLen, final char[] toDigits, 71 final char[] out, final int outOffset) { 72 // two characters form the hex value. 73 for (int i = dataOffset, j = outOffset; i < dataOffset + dataLen; i++) { 74 out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; 75 out[j++] = toDigits[0x0F & data[i]]; 76 } 77 } 78 79 /* 80 81 // Can be replaced in Java 17 with the following: 82 83 84 private static final java.util.HexFormat HEX_FORMAT = HexFormat.of(); 85 86 public static String encodeHex(byte[] bytes) { 87 return HEX_FORMAT.formatHex(bytes); 88 } 89 90 91 */ 92 93 94 }