Convertir una cadena a hexadecimal en Java

Estoy tratando de convertir una cadena como “testing123” en formato hexadecimal en java. Actualmente estoy usando BlueJ.

Y para convertirlo de nuevo, ¿es lo mismo, excepto al revés?

Aquí hay una forma corta de convertirlo a hexadecimal:

public String toHex(String arg) { return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/))); } 

Para garantizar que el hex sea siempre de 40 caracteres, BigInteger tiene que ser positivo:

 public String toHex(String arg) { return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/))); } 
 import org.apache.commons.codec.binary.Hex; ... String hexString = Hex.encodeHexString(myString.getBytes(/* charset */)); 

http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html

Los números codificados en hexadecimal deben representar cierta encoding de los caracteres, como UTF-8. Así que primero convierta la Cadena en un byte [] que represente la cadena en esa encoding, luego convierta cada byte a hexadecimal.

 public static String hexadecimal(String input, String charsetName) throws UnsupportedEncodingException { if (input == null) throw new NullPointerException(); return asHex(input.getBytes(charsetName)); } private static final char[] HEX_CHARS = "0123456789abcdef".toCharArray(); public static String asHex(byte[] buf) { char[] chars = new char[2 * buf.length]; for (int i = 0; i < buf.length; ++i) { chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4]; chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F]; } return new String(chars); } 

Utilice DatatypeConverter.printHexBinary() :

 public static String toHexadecimal(String text) throws UnsupportedEncodingException { byte[] myBytes = text.getBytes("UTF-8"); return DatatypeConverter.printHexBinary(myBytes); } 

Ejemplo de uso:

 System.out.println(toHexadecimal("Hello StackOverflow")); 

Huellas dactilares:

 48656C6C6F20537461636B4F766572666C6F77 

Todas las respuestas basadas en String.getBytes () implican la encoding de su cadena de acuerdo con un Charset. No necesariamente obtiene el valor hexadecimal de los caracteres de 2 bytes que componen su cadena. Si lo que realmente quieres es el equivalente a un visor hexadecimal, entonces necesitas acceder a los caracteres directamente. Aquí está la función que uso en mi código para depurar problemas Unicode:

 static String stringToHex(String string) { StringBuilder buf = new StringBuilder(200); for (char ch: string.toCharArray()) { if (buf.length() > 0) buf.append(' '); buf.append(String.format("%04x", (int) ch)); } return buf.toString(); } 

Entonces, stringToHex (“testing123”) le dará:

 0074 0065 0073 0074 0069 006e 0067 0031 0032 0033 

Aquí hay otra solución

 public static String toHexString(byte[] ba) { StringBuilder str = new StringBuilder(); for(int i = 0; i < ba.length; i++) str.append(String.format("%x", ba[i])); return str.toString(); } public static String fromHexString(String hex) { StringBuilder str = new StringBuilder(); for (int i = 0; i < hex.length(); i+=2) { str.append((char) Integer.parseInt(hex.substring(i, i + 2), 16)); } return str.toString(); } 

Sugeriría algo como esto, donde str es tu cadena de entrada:

 StringBuffer hex = new StringBuffer(); char[] raw = tokens[0].toCharArray(); for (int i=0;i 
 byte[] bytes = string.getBytes(CHARSET); // you didn't say what charset you wanted BigInteger bigInt = new BigInteger(bytes); String hexString = bigInt.toString(16); // 16 is the radix 

Puede devolver hexString en este punto, con la advertencia de que los caracteres null-leading principales se hexString , y el resultado tendrá una longitud impar si el primer byte es menor que 16. Si necesita manejar esos casos, puede agregar algunos código para rellenar con 0s:

 StringBuilder sb = new StringBuilder(); while ((sb.length() + hexString.length()) < (2 * bytes.length)) { sb.append("0"); } sb.append(hexString); return sb.toString(); 

Para obtener el valor entero de hex

  //hex like: 0xfff7931e to int int hexInt = Long.decode(hexString).intValue(); 

Convierta una letra en código hexadecimal y código hexadecimal en letra.

  String letter = "a"; String code; int decimal; code = Integer.toHexString(letter.charAt(0)); decimal = Integer.parseInt(code, 16); System.out.println("Hex code to " + letter + " = " + code); System.out.println("Char to " + code + " = " + (char) decimal); 

Primero conviértalo en bytes usando la función getBytes () y luego conviértalo en hexágono.

 private static String hex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i=0; i 

Para ir por el otro lado (hexadecimal a cadena), puede usar

 public String hexToString(String hex) { return new String(new BigInteger(hex, 16).toByteArray()); } 
 import java.io.*; import java.util.*; public class Exer5{ public String ConvertToHexadecimal(int num){ int r; String bin="\0"; do{ r=num%16; num=num/16; if(r==10) bin="A"+bin; else if(r==11) bin="B"+bin; else if(r==12) bin="C"+bin; else if(r==13) bin="D"+bin; else if(r==14) bin="E"+bin; else if(r==15) bin="F"+bin; else bin=r+bin; }while(num!=0); return bin; } public int ConvertFromHexadecimalToDecimal(String num){ int a; int ctr=0; double prod=0; for(int i=num.length(); i>0; i--){ if(num.charAt(i-1)=='a'||num.charAt(i-1)=='A') a=10; else if(num.charAt(i-1)=='b'||num.charAt(i-1)=='B') a=11; else if(num.charAt(i-1)=='c'||num.charAt(i-1)=='C') a=12; else if(num.charAt(i-1)=='d'||num.charAt(i-1)=='D') a=13; else if(num.charAt(i-1)=='e'||num.charAt(i-1)=='E') a=14; else if(num.charAt(i-1)=='f'||num.charAt(i-1)=='F') a=15; else a=Character.getNumericValue(num.charAt(i-1)); prod=prod+(a*Math.pow(16, ctr)); ctr++; } return (int)prod; } public static void main(String[] args){ Exer5 dh=new Exer5(); Scanner s=new Scanner(System.in); int num; String numS; int choice; System.out.println("Enter your desired choice:"); System.out.println("1 - DECIMAL TO HEXADECIMAL "); System.out.println("2 - HEXADECIMAL TO DECIMAL "); System.out.println("0 - EXIT "); do{ System.out.print("\nEnter Choice: "); choice=s.nextInt(); if(choice==1){ System.out.println("Enter decimal number: "); num=s.nextInt(); System.out.println(dh.ConvertToHexadecimal(num)); } else if(choice==2){ System.out.println("Enter hexadecimal number: "); numS=s.next(); System.out.println(dh.ConvertFromHexadecimalToDecimal(numS)); } }while(choice!=0); } } 
 new BigInteger(1, myString.getBytes(/*YOUR_CHARSET?*/)).toString(16) 

Convertir cadena a hexadecimal :

 public String hexToString(String hex) { return Integer.toHexString(Integer.parseInt(hex)); } 

Definitivamente esta es la manera fácil.

Mucho mejor:

 public static String fromHexString(String hex, String sourceEncoding ) throws IOException{ ByteArrayOutputStream bout = new ByteArrayOutputStream(); byte[] buffer = new byte[512]; int _start=0; for (int i = 0; i < hex.length(); i+=2) { buffer[_start++] = (byte)Integer.parseInt(hex.substring(i, i + 2), 16); if (_start >=buffer.length || i+2>=hex.length()) { bout.write(buffer); Arrays.fill(buffer, 0, buffer.length, (byte)0); _start = 0; } } return new String(bout.toByteArray(), sourceEncoding); } 

Aquí hay algunos puntos de referencia que comparan diferentes enfoques y bibliotecas. La guayaba supera al códec Apache Commons en la deencoding. El códec de Commons vence a Guava en la encoding. Y JHex los supera a ambos por decodificar y codificar.

Ejemplo JHex

 String hexString = "596f752772652077656c636f6d652e"; byte[] decoded = JHex.decodeChecked(hexString); System.out.println(new String(decoded)); String reEncoded = JHex.encode(decoded); 

Todo está en un solo archivo de clase para JHex . Siéntase libre de copiar pegar si no quiere otra biblioteca en su árbol de dependencias. También tenga en cuenta que solo está disponible como jar de Java 9 hasta que pueda descubrir cómo publicar varios objectives de lanzamiento con Gradle y el complemento de Bintray.

Una forma breve y conveniente de convertir una cadena a su notación hexadecimal es:

 public static void main(String... args){ String str = "Hello! This is test string."; char ch[] = str.toCharArray(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < ch.length; i++) { sb.append(Integer.toHexString((int) ch[i])); } System.out.println(sb.toString()); }