| /* |
| * Copyright (C) 2020, Michael Dardis. and others |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| package org.eclipse.jgit.util; |
| |
| import java.text.MessageFormat; |
| |
| import org.eclipse.jgit.internal.JGitText; |
| |
| /** |
| * Encodes and decodes to and from hexadecimal notation. |
| * |
| * @since 5.7 |
| */ |
| public final class Hex { |
| |
| private static final char[] HEX = "0123456789abcdef".toCharArray(); //$NON-NLS-1$ |
| |
| /** Defeats instantiation. */ |
| private Hex() { |
| // empty |
| } |
| |
| /** |
| * Decode a hexadecimal string to a byte array. |
| * |
| * Note this method validates that characters in the given string are valid |
| * as digits in a hex string. |
| * |
| * @param s |
| * hexadecimal string |
| * @return decoded array |
| */ |
| public static byte[] decode(String s) { |
| int len = s.length(); |
| byte[] b = new byte[len / 2]; |
| |
| for (int i = 0; i < len; i += 2) { |
| int left = Character.digit(s.charAt(i), 16); |
| int right = Character.digit(s.charAt(i + 1), 16); |
| |
| if (left == -1 || right == -1) { |
| throw new IllegalArgumentException(MessageFormat.format( |
| JGitText.get().invalidHexString, |
| s)); |
| } |
| |
| b[i / 2] = (byte) (left << 4 | right); |
| } |
| return b; |
| } |
| |
| /** |
| * Encode a byte array to a hexadecimal string. |
| * |
| * @param b byte array |
| * @return hexadecimal string |
| */ |
| public static String toHexString(byte[] b) { |
| char[] c = new char[b.length * 2]; |
| |
| for (int i = 0; i < b.length; i++) { |
| int v = b[i] & 0xFF; |
| |
| c[i * 2] = HEX[v >>> 4]; |
| c[i * 2 + 1] = HEX[v & 0x0F]; |
| } |
| |
| return new String(c); |
| } |
| } |