En Java, ¿cómo convierto una cadena hexadecimal en un byte ?

Estoy utilizando la siguiente función en Java para convertir una cadena cifrada en formato hexadecimal:

public static String toHex(byte [] buf) { StringBuffer strbuf = new StringBuffer(buf.length * 2); int i; for (i = 0; i < buf.length; i++) { if (((int) buf[i] & 0xff) < 0x10) { strbuf.append("0"); } strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); } return strbuf.toString(); } 

Ahora quiero convertir esa cadena hexadecimal nuevamente en una matriz de bytes. ¿Cómo puedo hacer eso?

Por ejemplo,

 (1) Plain Text = 123 (2) Encrypted Text = «h>kq*«¬Mí“~èåZ \}? (3) Encrypted Text in Hex = f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e 

Puedo pasar de (2) a (3) , pero ¿cómo puedo pasar de (3) a (2) ?

  String s="f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e"; byte[] b = new BigInteger(s,16).toByteArray(); 

La respuesta aceptada no considera ceros a la izquierda que pueden causar problemas

Esta pregunta lo contesta. Dependiendo de si desea ver cómo se hace o simplemente usar un método incorporado de Java. Aquí están las soluciones copiadas de esto y de estas respuestas, respectivamente, de la pregunta SO mencionada.

Opción 1: método Util

 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; } 

Opción 2: construcción de una sola línea

 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); } 

Descubrí que el DatatypeConverter.parseHexBinary es más costoso (dos veces) que:

 org.apache.commons.codec.binary.Hex(str.toCharArray())