Artículo

Convierte un Array de Bytes a una Cadena Hexadecimal en Java

Cómo Convertir un Array de Bytes a una Cadena Hexadecimal en Java 1. Overview En este tutorial, vamos a explorar diferentes maneras de convertir un array de bytes a una cadena hexadecimal, así como hacer la conversión inversa. Además, entenderemos el mecanismo de conversión y desarrollaremos nuestra propia implementación para lograrlo. La conversión entre bytes […]

Convierte un Array de Bytes a una Cadena Hexadecimal en Java

Cómo Convertir un Array de Bytes a una Cadena Hexadecimal en Java


1. Overview

En este tutorial, vamos a explorar diferentes maneras de convertir un array de bytes a una cadena hexadecimal, así como hacer la conversión inversa. Además, entenderemos el mecanismo de conversión y desarrollaremos nuestra propia implementación para lograrlo.

La conversión entre bytes y representaciones hexadecimales es un procedimiento común en la programación, especialmente en aplicaciones que involucran criptografía, redes y procesamiento de archivos binarios. Java proporciona varias formas de llevar a cabo estas conversiones, lo que lo convierte en un tema esencial para cualquier programador que trabaje con datos a nivel bajo.


2. Convirtiendo entre Byte y Hexadecimal

Primero, examinemos la lógica detrás de la conversión entre números en byte y hexadecimal.

2.1. Byte a Hexadecimal

Los bytes son enteros con signo de 8 bits en Java. Por lo tanto, necesitamos convertir cada segmento de 4 bits a hexadecimal por separado y concatenarlos. Como resultado, obtendremos dos caracteres hexadecimales tras la conversión.

Ejemplo:

public String byteToHex(byte num) {
    char[] hexDigits = new char[2];
    hexDigits[0] = Character.forDigit((num >> 4) & 0xF, 16);
    hexDigits[1] = Character.forDigit((num & 0xF), 16);
    return new String(hexDigits);
}

Explicación paso a paso:

  1. char[] hexDigits = new char[2];
    Creamos un array de caracteres de longitud 2 para almacenar el resultado.

  2. hexDigits[0] = Character.forDigit((num >> 4) & 0xF, 16);
    Desplazamos a la derecha 4 bits y aplicamos la máscara 0xF para obtener los 4 bits de mayor orden.

  3. hexDigits[1] = Character.forDigit((num & 0xF), 16);
    Obtenemos los 4 bits de menor orden.

  4. return new String(hexDigits);
    Creamos una String a partir del array y la retornamos.

Para un byte negativo, por ejemplo -4, la salida será "fc".

2.2. Hexadecimal a Byte

Para convertir un dígito hexadecimal a byte:

public byte hexToByte(String hexString) {
    int firstDigit = toDigit(hexString.charAt(0));
    int secondDigit = toDigit(hexString.charAt(1));
    return (byte) ((firstDigit << 4) + secondDigit);
}

private int toDigit(char hexChar) {
    int digit = Character.digit(hexChar, 16);
    if (digit == -1) {
        throw new IllegalArgumentException("Carácter hexadecimal inválido: " + hexChar);
    }
    return digit;
}

3. Convirtiendo entre Arrays de Bytes y Cadenas Hexadecimales

3.1. Array de Bytes a Cadena Hexadecimal

public String encodeHexString(byte[] byteArray) {
    StringBuffer hexStringBuffer = new StringBuffer();
    for (int i = 0; i < byteArray.length; i++) {
        hexStringBuffer.append(byteToHex(byteArray[i]));
    }
    return hexStringBuffer.toString();
}

3.2. Cadena Hexadecimal a Array de Bytes

public byte[] decodeHexString(String hexString) {
    if (hexString.length() % 2 == 1) {
        throw new IllegalArgumentException("Cadena hexadecimal no válida.");
    }

    byte[] bytes = new byte[hexString.length() / 2];
    for (int i = 0; i < hexString.length(); i += 2) {
        bytes[i / 2] = hexToByte(hexString.substring(i, i + 2));
    }
    return bytes;
}

4. Usando la Clase BigInteger

public String encodeUsingBigIntegerStringFormat(byte[] bytes) {
    BigInteger bigInteger = new BigInteger(1, bytes);
    return String.format("%0" + (bytes.length << 1) + "x", bigInteger);
}
public String encodeUsingBigIntegerToString(byte[] bytes) {
    BigInteger bigInteger = new BigInteger(1, bytes);
    return bigInteger.toString(16);
}
public byte[] decodeUsingBigInteger(String hexString) {
    byte[] byteArray = new BigInteger(hexString, 16).toByteArray();
    if (byteArray[0] == 0) {
        byte[] output = new byte[byteArray.length - 1];
        System.arraycopy(byteArray, 1, output, 0, output.length);
        return output;
    }
    return byteArray;
}

5. Usando la Clase DataTypeConverter

public String encodeUsingDataTypeConverter(byte[] bytes) {
    return DatatypeConverter.printHexBinary(bytes);
}
public byte[] decodeUsingDataTypeConverter(String hexString) {
    return DatatypeConverter.parseHexBinary(hexString);
}

6. Usando la Biblioteca Commons‑Codec de Apache

public String encodeUsingApacheCommons(byte[] bytes) throws DecoderException {
    return Hex.encodeHexString(bytes);
}
public byte[] decodeUsingApacheCommons(String hexString) throws DecoderException {
    return Hex.decodeHex(hexString);
}

7. Usando la Biblioteca Guava de Google

public String encodeUsingGuava(byte[] bytes) {
    return BaseEncoding.base16().encode(bytes);
}
public byte[] decodeUsingGuava(String hexString) {
    return BaseEncoding.base16().decode(hexString.toUpperCase());
}

8. Usando HexFormat de Java 17

8.1. Array de Bytes a Cadena Hexadecimal

public String encodeUsingHexFormat(byte[] bytes) {
    HexFormat hexFormat = HexFormat.of();
    return hexFormat.formatHex(bytes);
}

8.2. Cadena Hexadecimal a Array de Bytes

public byte[] decodeUsingHexFormat(String hexString) {
    HexFormat hexFormat = HexFormat.of();
    return hexFormat.parseHex(hexString);
}

9. Conclusión

En este artículo, aprendimos el algoritmo de conversión entre un array de bytes y una cadena hexadecimal. También discutimos diversos métodos para codificar arrays de bytes en cadenas hexadecimales y viceversa.

No se recomienda añadir una biblioteca para utilizar solo un par de métodos de utilidad. Por lo tanto, si no estamos utilizando ya las bibliotecas externas, deberíamos optar por el algoritmo que hemos discutido. La clase DataTypeConverter es otro método efectivo para codificar/decodificar entre varios tipos de datos.

Con el conocimiento adquirido, ahora puedes implementar y utilizar conversiones de bytes a hexadecimales en tus aplicaciones Java con facilidad. ¡Feliz codificación!

¿Quieres acelerar tu carrera como desarrollador Java?

Reserva una Sesión de Estrategia Técnica gratuita y descubre cómo pasar de Junior a Senior en menos tiempo del que imaginas.

  • Diagnóstico personalizado de tu nivel técnico
  • Plan de acción para conseguir tu próximo ascenso
  • Mentoría 1-a-1 enfocada en resultados

⚡ Plazas disponibles limitadas

Compartir artículo