2012-12-21 21 views
24

Zum Protokollieren Zweck einige andere Leute, die Protokolle in Byte-Array und dann in Hexadezimalstring konvertieren. Aber ich will es in Java-String zurück zu bekommen, aber nicht in der Lage, dies zu tun,Wie hexadezimale Zeichenfolge in Java-Zeichenfolge konvertieren

die String hex in Log-Datei sieht so etwas wie

fd00000aa8660b5b010006acdc0100000101000100010000 

Kann jemand plz helfen, sie zu entschlüsseln?

Dank im Voraus ..

+7

Sie beginnen sollten einige Ihrer Fragen zu markieren als beantwortet, wird es Ihnen helfen, Antworten zu bekommen. –

+1

Ich habe Ihnen eine Abstimmungsentscheidung gegeben, weil ich keine vorherigen Forschungen/Bemühungen gezeigt habe. –

Antwort

5

Vor allem in den gelesenen Daten, konvertiert sie dann in Byte-Array:

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

und dann String Konstruktor verwenden:

new String(byte[] bytes) 

oder wenn der Zeichensatz ist nicht Systemstandard dann:

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

Natürlich kann es oder kann nicht funktionieren abhängig von der Codierung von "einigen anderen Jungs". Vielleicht haben sie Latin-9 benutzt. Oder UTF-8. Oder EUC-JP. Oder vielleicht war es in Big-Endian. Wer weiß? –

+0

Deshalb sollten Sie die Codierung angeben, die von Protokollstrings vor der Konvertierung in Hexadezimalzeichenfolge verwendet wurde. –

+1

Verwenden Sie 'Byte.parseByte (str, 16);', um eine Hexadezimalzahl zu analysieren. – gogognome

38

Mit Hex in Apache Commons:

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

Versuchen Sie, den folgenden Code:

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

} 

in String konvertieren gerade einen neuen String mit den [] Byte erstellen, indem die Decodier Methode zurückgegeben.

+0

Ich habe Byte.parseByte in (Byte) Integer.parseInteger geändert, damit Zahlen> 128 geparst werden können. – domenukk

+0

@domenukk es ist Integer.parseInt (..) nicht Integer.parseInteger (..). Byte.parseByte wie folgt implementiert {return (byte) Integer.parseInt (Str, Basis);} – Error

+0

@Munene Thanx 4 Regex – Error

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

Wo zum Teufel finde ich 'DatatypeConverter'? – zundi

+2

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

2

nur ein weiterer Weg, Hex-String zu Java-Zeichenfolge zu konvertieren:

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

Viele Teilstrings werden erstellt. Nicht ideal. – Jonathan

3

Sie können String (hex)-byte array zu String as UTF-8(?) gehen. Stellen Sie sicher, dass Ihre Hex-Zeichenfolge keine führenden Leerzeichen und Zeug hat.

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

Verbrauch:

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

how to tun für Versionen unter kitkat? –

Verwandte Themen