Here are a few Java examples of converting between String or ASCII to and from Hexadecimal.

  • Apache Commons Codec – Hex
  • Integer
  • Bitwise
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

1. Apache Commons Codec

Both Hex.encodeHex and Hex.decodeHex can convert String to Hex and vice versa.

pom.xml

  <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.14</version>
  </dependency>

HexUtils.java

package com.favtuts.converter;

import java.nio.charset.StandardCharsets;

import org.apache.commons.codec.binary.Hex;

public class HexUtils {

    public static String convertStringToHex(String str) {
        // display in uppercase
        //char[] chars = Hex.encodeHex(str.getBytes(StandardCharsets.UTF_8), false);

        // display in lowercase, default
        char[] chars = Hex.encodeHex(str.getBytes(StandardCharsets.UTF_8));

        return String.valueOf(chars);
    }

    public static String convertHexToString(String hex) {
        String result = "";
        try {
            byte[] bytes = Hex.decodeHex(hex);
            result = new String(bytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw new IllegalArgumentException("Invalid Hex format!");
        }
        return result;
    }

    public static void main(String[] args) {
        String input = "a";
        System.out.println("input : " + input);

        String hex = convertStringToHex(input);
        System.out.println("hex : " + hex);

        String result = convertHexToString(hex);
        System.out.println("result : " + result); 
    }
}

Output

input : a
hex : 61
result : a

2. Integer

This example is easy to understand, use JDK Integer APIs like Integer.toHexString and Integer.parseInt(hex, 16) to convert the String to Hex and vice versa.

The idea is convert String <==> Decimal <==> Hex, for example char a, decimal is 97, hex is 61.

HexUtils2.java

package com.favtuts.converter;

public class HexUtils2 {
    
    // Char -> Decimal -> Hex
    public static String convertStringToHex(String str) {
        StringBuilder hex = new StringBuilder();

        // loop chars one by one
        for (char temp : str.toCharArray()) {
            // convert char to int, for char 'a' decimal 97
            int decimal = (int) temp;

            // convert int to hex, for decimal 97 hex 61
            hex.append(Integer.toHexString(decimal));
        }

        return hex.toString();
    }

    // Hex -> Decimal -> Char
    public static String convertHexToString(String hex) {
        StringBuilder result = new StringBuilder();

        // split into two chars per loop, hex, 0A, 0B, 0C...
        for (int i = 0; i < hex.length() - 1; i += 2) {
            String tempInHex = hex.substring(i, (i + 2));

            // convert hex to decimal
            int decimal = Integer.parseInt(tempInHex, 16);

            // convert the decimal to char
            result.append((char) decimal);
        }

        return result.toString();
    }

    public static void main(String[] args) {
        String input = "a";
        // String input = "java";
        System.out.println("input : " + input);

        String hex = convertStringToHex(input);
        System.out.println("hex : " + hex);

        String result = convertHexToString(hex);
        System.out.println("result : " + result);
    }
}

Output

input : a
hex : 61
result : a

For input java

input : java
hex : 6a617661
result : java

3. Bitwise

This bitwise conversion is similar to the Apache Commons Codec source code, read comment for self-explanatory.

HexUtils3.java

package com.favtuts.converter;

import java.nio.charset.StandardCharsets;

public class HexUtils3 {

    private static final char[] HEX_UPPER = "0123456789ABCDEF".toCharArray();
    private static final char[] HEX_LOWER = "0123456789abcdef".toCharArray();
    
    public static void main(String[] args) {

        String input = "java";
        System.out.println("input : " + input);

        String hex = convertStringToHex(input, false);
        System.out.println("hex : " + hex);

    }

    public static String convertStringToHex(String str, boolean lowercase) {

        char[] HEX_ARRAY = lowercase ? HEX_LOWER : HEX_UPPER;

        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);

        // two chars form the hex value.
        char[] hex = new char[bytes.length * 2];

        for (int j = 0; j < bytes.length; j++) {

            // 1 byte = 8 bits,
            // upper 4 bits is the first half of hex
            // lower 4 bits is the second half of hex
            // combine both and we will get the hex value, 0A, 0B, 0C

            int v = bytes[j] & 0xFF;               // byte widened to int, need mask 0xff
                                                   // prevent sign extension for negative number

            hex[j * 2] = HEX_ARRAY[v >>> 4];       // get upper 4 bits

            hex[j * 2 + 1] = HEX_ARRAY[v & 0x0F];  // get lower 4 bits

        }

        return new String(hex);

    }

}

Output

input : java
hex : 6A617661

Note

If you are confused, picks Apache Commons Codec for the safe bet.

Download Source Code

$ git clone https://github.com/favtuts/java-core-tutorials-examples

$ cd java-misc

References

Leave a Reply

Your email address will not be published. Required fields are marked *