I have two methods in my code which are using the majority of the CPU time that convert between binary and hex strings and the reverse. I use a static lookup map to convert the individual characters but it's still slow given the amount of data I'm working with.
public static String hexToBin(String s)
{
StringBuilder binaryString = new StringBuilder();
for(int i = 0; i < s.length(); i++)
{
// This string loop can be quite long sometimes > 3000 chars
binaryString.append(binMap.get(s.charAt(i)));
}
return binaryString.toString();
}
public static String binToHex(String s)
{
if (s.length() % 4 != 0)
{
s = Utils.leftPad4(s, (int)(4 * Math.ceil((double) s.length() / 4.0))); // Pad out any single bit values
}
StringBuilder hexString = new StringBuilder();
StringBuilder chars = new StringBuilder();
for (int i = 0; i < s.length(); i += 4)
{
chars.append(s.charAt(i));
chars.append(s.charAt(i + 1));
chars.append(s.charAt(i + 2));
chars.append(s.charAt(i + 3));
hexString.append(hexMap.get(chars.toString()));
chars.delete(0, chars.length());
}
return hexString.toString();
}
/* The lookup tables */
private static Map<Character, String> binMap = new HashMap<>();
private static Map<String, Character> hexMap = new HashMap<>();
public Types()
{
binMap.put('0', "0000"); binMap.put('1', "0001"); binMap.put('2', "0010");
binMap.put('3', "0011"); binMap.put('4', "0100"); binMap.put('5', "0101");
binMap.put('6', "0110"); binMap.put('7', "0111"); binMap.put('8', "1000");
binMap.put('9', "1001"); binMap.put('A', "1010"); binMap.put('B', "1011");
binMap.put('C', "1100"); binMap.put('D', "1101"); binMap.put('E', "1110");
binMap.put('F', "1111");
for (Character k : binMap.keySet())
{
hexMap.put(binMap.get(k), k);
}
}