Conversione di una stringa in esadecimale in Java

Sto cercando di convertire una stringa come “testing123” in forma esadecimale in java. Attualmente sto usando BlueJ.

E per riconvertirlo, è la stessa cosa tranne che all’indietro?

Ecco un breve modo per convertirlo in esadecimale:

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

Per assicurarsi che l’esadecimale sia sempre lungo 40 caratteri, il BigInteger deve essere 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

I numeri che si codificano in esadecimali devono rappresentare una codifica dei caratteri, come UTF-8. Quindi, prima converti la stringa in un byte [] che rappresenta la stringa in quella codifica, quindi converti ciascun byte in esadecimale.

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

Usa DatatypeConverter.printHexBinary() :

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

Esempio di utilizzo:

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

stampe:

 48656C6C6F20537461636B4F766572666C6F77 

Tutte le risposte basate su String.getBytes () implicano la codifica della stringa in base a un set di caratteri. Non si ottiene necessariamente il valore esadecimale dei caratteri a 2 byte che costituiscono la stringa. Se ciò che realmente vuoi è l’equivalente di un visualizzatore esadecimale, devi accedere direttamente ai caratteri. Ecco la funzione che uso nel mio codice per il debug di problemi 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(); } 

Quindi, stringToHex (“testing123”) ti darà:

 0074 0065 0073 0074 0069 006e 0067 0031 0032 0033 

Ecco un’altra soluzione

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

Vorrei suggerire qualcosa di simile, dove str è la stringa di 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 

Potresti restituire hexString a questo punto, con l’avvertenza che porta i caratteri nulli saranno eliminati, e il risultato avrà una lunghezza dispari se il primo byte è inferiore a 16. Se devi gestire questi casi, puoi aggiungere alcuni extra codice per il rilievo con 0:

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

Per ottenere il valore intero di esadecimale

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

Convertire una lettera in codice esadecimale e il codice esadecimale in lettere.

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

Prima convertilo in byte usando la funzione getBytes () e poi convertilo in hex usign questo:

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

Per andare dall’altra parte (da esadecimale a stringa), puoi usare

 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) 

Converti stringa in esadecimale :

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

sicuramente questo è il modo semplice.

Molto meglio:

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

Ecco alcuni benchmark che confrontano diversi approcci e librerie. Guava batte Apache Commons Codec alla decodifica. Commons Codec batte Guava alla codifica. E JHex li batte entrambi per la decodifica e la codifica.

Esempio di JHex

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

Tutto è in un unico file di class per JHex . Sentiti libero di copiare incolla se non vuoi ancora un’altra libreria nell’albero delle dipendenze. Inoltre, è disponibile solo come jar Java 9 fino a quando non riesco a capire come pubblicare più target di release con Gradle e il plugin Bintray.

Un modo breve e conveniente per convertire una stringa nella sua notazione esadecimale è:

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