Sometimes, we may want to format a bytes array into hexadecimal (base-16) format for debugging purpose or for better readability. One byte has 8 bits and one byte can be represent by two hexadecimal characters (0 – 15 and A – F).
You can use the Java’s String.format to print out each byte but I still prefer my own way of doing it, which I believe it will perform a little bit faster. The following code shows the way to convert bytes array into hexadecimal string and vice versa.
public class Bytes {
private final static char[] HEX = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
public static String toHex(byte[] bytes) {
StringBuilder buffer;
buffer = new StringBuilder();
for (byte b : bytes) {
buffer.append(HEX[(b >> 4) & 0xf]);
buffer.append(HEX[b & 0xf]);
}
return buffer.toString();
}
public static byte[] fromHex(String hex) throws NumberFormatException {
char[] chars;
char c;
int i;
int j;
byte[] bytes;
byte b;
chars = hex.toUpperCase().toCharArray();
if (chars.length % 2 != 0) {
throw new NumberFormatException("Incomplete hex value");
}
bytes = new byte[chars.length / 2];
b = 0;
j = 0;
for (i = 0; i < chars.length; i++) {
c = chars[i];
if (c >= '0' && c <= '9') {
b = (byte) ((b << 4) | (0xff & (c - '0')));
} else if (c >= 'A' && c <= 'F') {
b = (byte) ((b << 4) | (0xff & (c - 'A' + 10)));
} else {
throw new NumberFormatException("Invalid hex character: " + c);
}
if ((i + 1) % 2 == 0) {
bytes[j++] = b;
b = 0;
}
}
return bytes;
}
}
Leave a Reply