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 […]

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:
-
char[] hexDigits = new char[2];
Creamos un array de caracteres de longitud 2 para almacenar el resultado. -
hexDigits[0] = Character.forDigit((num >> 4) & 0xF, 16);
Desplazamos a la derecha 4 bits y aplicamos la máscara0xFpara obtener los 4 bits de mayor orden. -
hexDigits[1] = Character.forDigit((num & 0xF), 16);
Obtenemos los 4 bits de menor orden. -
return new String(hexDigits);
Creamos unaStringa 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