51

For logging purpose we are converting the logs to byte array and then to hex string. I want to get it back in a Java String, but I am not able to do so.

The hex string in log file looks something like

fd00000aa8660b5b010006acdc0100000101000100010000

How can I decode this?

Kyll
  • 6,999
  • 7
  • 40
  • 61
Samra
  • 825
  • 1
  • 8
  • 15

7 Answers7

68

Using Hex in Apache Commons:

String hexString = "fd00000aa8660b5b010006acdc0100000101000100010000";    
byte[] bytes = Hex.decodeHex(hexString.toCharArray());
System.out.println(new String(bytes, "UTF-8"));
Reimeus
  • 155,977
  • 14
  • 207
  • 269
34
byte[] bytes = javax.xml.bind.DatatypeConverter.parseHexBinary(hexString);
String result= new String(bytes, encoding);
telebog
  • 1,566
  • 4
  • 21
  • 32
13

You can go from String (hex) to byte array to String as UTF-8(?). Make sure your hex string does not have leading spaces and stuff.

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);
catch23
  • 15,848
  • 39
  • 135
  • 206
Debosmit Ray
  • 4,970
  • 2
  • 26
  • 42
10

First of all read in the data, then convert it to byte array:

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

and then use String constructor:

new String(byte[] bytes) 

or if the charset is not system default then:

new String(byte[] bytes, String charsetName) 
Aleksander Gralak
  • 1,391
  • 9
  • 25
  • Of course, it may or may not work depending on encoding used by "some other guys". Maybe they used Latin-9. Or UTF-8. Or EUC-JP. Or maybe it was in Big-Endian. Who knows? – Joker_vD Dec 21 '12 at 13:24
  • That's why you should specify the encoding which was used by log strings before conversion to hex string. – Aleksander Gralak Dec 21 '12 at 13:25
  • 1
    use `Byte.parseByte(str, 16);` to parse a hexadecimal number. – gogognome Dec 21 '12 at 13:36
  • The String constructor expects a byte array and not just byte, I tried and it failed. – kodepet Feb 01 '16 at 12:59
  • @Callforeach yes it it exactly what I gave as en example, byte[] stands for array not single byte: new String(byte[] bytes) – Aleksander Gralak Feb 03 '16 at 08:46
  • I'm not following... where did you get the `bytes` byte array from? – zundi May 11 '17 at 03:28
  • 1
    @zundi in first line you parse only single byte. So you need to use a loop to get all the bytes and put them in array. Please look at Munene iUwej Julius answer. His method is doing just that – Aleksander Gralak May 11 '17 at 20:37
6

Try the following 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();

}

To convert to String just create a new String with the byte[] returned by the decode method.

rink.attendant.6
  • 40,889
  • 58
  • 100
  • 149
5

Just another way to convert hex string to java string:

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;
}
Kunal Surana
  • 649
  • 5
  • 11
1

There is yet another way to do this if using JDK17 or above, see the new HexFormat class which has useful methods for converting byte[] <=> hexadecimal String :

String hexStr ="5468697320697320616e206578616d706c6520737472696e67";
byte[] bytes = HexFormat.of().parseHex(hexStr);
String str = new String(bytes, StandardCharsets.UTF_8 /* or Charset.forName("whateverencoding")*/);

You of course need to know the exact character encoding of the hexadecimal representation in order to generate the correct String value.

DuncG
  • 8,288
  • 2
  • 17
  • 23