¿Convertir una representación de cadena de un volcado hexadecimal en una matriz de bytes usando Java?
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 BigInteger
y prestando atención a los ceros hexadecimales iniciales. Pero creo que es feo y estoy seguro de que me falta algo simple.
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 assert
o excepciones si no se sabe que el argumento sea seguro.
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
Fabian
señalarlo), pero puedes tomar el código fuente si tu sistema no lo tienejavax.xml
por algún motivo. Gracias a @Bert Regelink
por extraer la fuente.
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