¿Convertir una representación de cadena de un volcado hexadecimal en una matriz de bytes usando Java?

Resuelto rafraf asked hace 15 años • 25 respuestas

Estoy buscando una manera de convertir una cadena larga (de un volcado) que represente valores hexadecimales en una matriz de bytes.

No podría haberlo expresado mejor que la persona que publicó la misma pregunta aquí .

Pero para mantenerlo original, lo expresaré a mi manera: supongamos que tengo una cadena "00A0BF"que me gustaría interpretar como la

byte[] {0x00,0xA0,0xBf}

¿Qué tengo que hacer?

Soy un novato en Java y terminé usando BigIntegery prestando atención a los ceros hexadecimales iniciales. Pero creo que es feo y estoy seguro de que me falta algo simple.

rafraf avatar Sep 26 '08 22:09 rafraf
Aceptado

Actualización (2021): Java 17 ahora incluye java.util.HexFormat(solo tomó 25 años):

HexFormat.of().parseHex(s)


Para versiones anteriores de Java:

Aquí hay una solución que creo que es mejor que cualquiera publicada hasta ahora:

/* s must be an even-length string. */
public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

Razones por las que es una mejora:

  • Seguro con ceros a la izquierda (a diferencia de BigInteger) y con valores de bytes negativos (a diferencia de Byte.parseByte)

  • No convierte String en a char[], ni crea objetos StringBuilder y String para cada byte.

  • No hay dependencias de biblioteca que puedan no estar disponibles.

Siéntase libre de agregar verificación de argumentos vía asserto excepciones si no se sabe que el argumento sea seguro.

Dave L. avatar Sep 26 '2008 17:09 Dave L.

Frases ingeniosas:

import javax.xml.bind.DatatypeConverter;

public static String toHexString(byte[] array) {
    return DatatypeConverter.printHexBinary(array);
}

public static byte[] toByteArray(String s) {
    return DatatypeConverter.parseHexBinary(s);
}

Advertencias :

  • en Java 9 Jigsaw, esto ya no forma parte del conjunto raíz java.se (predeterminado), por lo que generará una excepción ClassNotFoundException a menos que especifique --add-modules java.se.ee (gracias a @ eckes)
  • No está disponible en Android (gracias por Fabianseñalarlo), pero puedes tomar el código fuente si tu sistema no lo tiene javax.xmlpor algún motivo. Gracias a @ Bert Regelinkpor extraer la fuente.
Vladislav Rastrusny avatar May 09 '2011 21:05 Vladislav Rastrusny

La clase Hex en commons-codec debería hacer eso por usted.

http://commons.apache.org/codec/

import org.apache.commons.codec.binary.Hex;
...
byte[] decoded = Hex.decodeHex("00A0BF");
// 0x00 0xA0 0xBF
skaffman avatar Sep 26 '2008 15:09 skaffman