Convertendo uma Cadeia de Caracteres em Hexadecimal em Java

Eu estou tentando converter uma string como “testing123” em forma hexadecimal em java. Atualmente estou usando o BlueJ.

E para convertê-lo de volta, é a mesma coisa, exceto para trás?

Aqui está um pequeno caminho para convertê-lo em hexadecimal:

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

Para garantir que o hex tem 40 caracteres, o BigInteger deve 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

Os números que você codifica em hexadecimal devem representar alguma codificação dos caracteres, como UTF-8. Então, primeiro converta o String em um byte [] representando a string nessa codificação, depois converta cada byte em 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); } 

Use DatatypeConverter.printHexBinary() :

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

Exemplo de uso:

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

Impressões:

 48656C6C6F20537461636B4F766572666C6F77 

Todas as respostas baseadas em String.getBytes () envolvem codificar sua string de acordo com um Charset. Você não necessariamente obtém o valor hexadecimal dos caracteres de 2 bytes que compõem sua string. Se o que você realmente quer é o equivalente a um visualizador hexadecimal, então você precisa acessar os caracteres diretamente. Aqui está a function que eu uso no meu 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(); } 

Então, stringToHex (“testing123”) lhe dará:

 0074 0065 0073 0074 0069 006e 0067 0031 0032 0033 

Aqui uma outra solução

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

Eu sugeriria algo assim, onde str é sua string de input:

 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 

Você poderia retornar hexString neste ponto, com a ressalva de que os caracteres nulos iniciais serão removidos, e o resultado terá um comprimento ímpar se o primeiro byte for menor que 16. Se você precisar lidar com esses casos, você pode adicionar alguns extras código para pad com 0s:

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

Para obter o valor inteiro de hex

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

Converta uma letra em código hexadecimal e código hexadecimal em 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); 

Primeiro converta-o em bytes usando a function getBytes () e depois converta-o em hex usign this:

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

Para ir para o outro lado (hex a string), você pode 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) 

Converter String para Hexadecimal :

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

Definitivamente este é o caminho mais fácil.

Muito melhor:

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

Aqui estão alguns benchmarks comparando diferentes abordagens e bibliotecas. Guava supera o Apache Commons Codec na decodificação. Commons Codec bate em Guava na codificação. E o JHex bate em ambos para decodificação e codificação.

Exemplo JHex

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

Tudo está em um único arquivo de class para o JHex . Sinta-se à vontade para copiar e colar, se você não quiser mais uma biblioteca na sua tree de dependencies. Observe também que ele está disponível apenas como jar do Java 9 até que eu possa descobrir como publicar vários destinos de lançamento com o Gradle e o plug-in Bintray.

Uma maneira curta e conveniente de converter uma String em sua notação hexadecimal é:

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