2012-12-21 26 views
24

Per scopi di registrazione alcuni altri tipi convertono i registri in serie di byte e quindi in stringa esadecimale. Ma voglio farlo tornare in String Java, ma non in grado di farlo,Come convertire stringa esadecimale in stringa java

la stringa esadecimale nel file di log simile a

fd00000aa8660b5b010006acdc0100000101000100010000 

qualcuno può plz aiutare a decodificarlo?

Grazie in anticipo ..

+7

Si dovrebbe cominciare a segnare alcune delle vostre domande come risposta, vi aiuterà a ottenere più risposte. –

+1

Ti ho dato un voto negativo per non aver dimostrato alcuna ricerca/sforzo precedente. –

risposta

5

Prima di tutto leggere i dati, quindi convertirlo in array di byte:

byte b = Byte.parseByte(str, 16); 

e quindi utilizzare String costruttore:

new String(byte[] bytes) 

o se il set di caratteri non è predefinito dal sistema:

new String(byte[] bytes, String charsetName) 
+0

Ovviamente, può o non può funzionare a seconda della codifica usata da "alcuni altri ragazzi". Forse hanno usato Latin-9. O UTF-8. O EUC-JP. O forse era in Big-Endian. Chissà? –

+0

Ecco perché è necessario specificare la codifica utilizzata dalle stringhe di registro prima della conversione in stringa esadecimale. –

+1

usa 'Byte.parseByte (str, 16);' per analizzare un numero esadecimale. – gogognome

38

Utilizzando Hex in Apache Commons:

String hexString = "fd00000aa8660b5b010006acdc0100000101000100010000";  
byte[] bytes = Hex.decodeHex(hexString.toCharArray()); 
System.out.println(new String(bytes, "UTF-8")); 
3

provare il seguente codice:

public static byte[] decode(String hex){ 

     String[] list=hex.split("(?<=\\G.{2})"); 
     ByteBuffer buffer= ByteBuffer.allocate(list.length); 
     System.out.println(list.length); 
     for(String str: list) 
      buffer.put(Byte.parseByte(str,16)); 

     return buffer.array(); 

} 

Convertire in String basta creare una nuova stringa con il byte [] restituito dal metodo di decodifica.

+0

Ho cambiato Byte.parseByte in (byte) Integer.parseInteger per consentire l'analisi dei numeri> 128 da analizzare. – domenukk

+0

@domenukk è Integer.parseInt (..) non Integer.parseInteger (..). Byte.parseByte implementato come segue {return (byte) Integer.parseInt (Str, base);} – Error

+0

@Munene thanx 4 regex – Error

18
byte[] bytes = DatatypeConverter.parseHexBinary(hexString); 
String result= new String(bytes, encoding); 
+1

Dove diavolo trovo 'DatatypeConverter'? – zundi

+2

https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html – telebog

2

Solo un altro modo per convertire stringa esadecimale a stringa java:

public static String unHex(String arg) {   

    String str = ""; 
    for(int i=0;i<arg.length();i+=2) 
    { 
     String s = arg.substring(i, (i + 2)); 
     int decimal = Integer.parseInt(s, 16); 
     str = str + (char) decimal; 
    }  
    return str; 
} 
+0

Numerose sottostringhe in fase di creazione. Non ideale – Jonathan

3

si può andare String (hex)-byte array a String as UTF-8(?). Assicurati che la stringa esadecimale non contenga spazi iniziali e roba.

public static byte[] hexStringToByteArray(String hex) { 
    int l = hex.length(); 
    byte[] data = new byte[l/2]; 
    for (int i = 0; i < l; i += 2) { 
     data[i/2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) 
          + Character.digit(hex.charAt(i+1), 16)); 
    } 
    return data; 
} 

Usage:

String b = "0xfd00000aa8660b5b010006acdc0100000101000100010000"; 
byte[] bytes = hexStringToByteArray(b); 
String st = new String(bytes,StandardCharsets.UTF_8); 
System.out.println(st); 
+0

come si fa per le versioni sotto kitkat? –

Problemi correlati