public class HexString implements StringItem {
/**
+ * Hexadecimal digit characters.
+ */
+ private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
+ '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+ /**
* The hexadecimal string.
*/
private String string;
throw ex;
}
StringBuilder builder = new StringBuilder();
- for (char c: string.toCharArray()) {
+ for (char c : string.toCharArray()) {
if (Character.digit(c, 16) >= 0) {
builder.append(c);
}
public HexString(byte... array) {
StringBuilder builder = new StringBuilder();
for (Byte b : array) {
- builder.append(String.format("%02X", b));
+ builder.append(HEX_DIGITS[(b & 0xf0) >> 4]);
+ builder.append(HEX_DIGITS[b & 0x0f]);
}
string = builder.toString();
}
public boolean[] toBinArray() {
boolean[] array = new boolean[string.length() * 4];
int index = 0, mask = 0;
- byte octet = 0;
+ int octet = 0;
for (int i = 0; i < array.length; i++) {
if (mask == 0) {
- octet = Byte.parseByte(string.substring(index++, index), 16);
+ octet = charToInt(string.charAt(index++));
mask = 8;
}
array[i] = (octet & mask) > 0;
* @return An array of {@code byte}.
*/
public byte[] toByteArray() {
- byte[] array = new byte[string.length() / 2 + string.length() % 2];
- byte octet = 0;
- for (int i = 0; i < string.length(); i++) {
- octet = Integer.valueOf(string.substring(i, i + 1), 16).byteValue();
- if (i % 2 == 0) {
- array[i / 2] = (byte) (octet << 4);
- } else {
- array[i / 2] = (byte) (array[i / 2] + octet);
- }
+ byte[] array = new byte[(string.length() + 1) / 2];
+ int ci = string.length() - 1, bi = array.length - 1;
+ if (string.length() % 2 != 0) {
+ array[bi--] = (byte) (charToInt(string.charAt(ci--)) << 4);
+ }
+ for (; ci > 0; bi--) {
+ array[bi] = (byte) charToInt(string.charAt(ci--));
+ array[bi] += (byte) (charToInt(string.charAt(ci--)) << 4);
}
return array;
}
return '\'' + string + "\'H";
}
+ /**
+ * Converts a hexadecimal {@code char} to {@code int} value.
+ *
+ * @param c A hexadecimal character.
+ * @return The integer value.
+ */
+ private int charToInt(char c) {
+ return c <= '9' ? c - '0' : c + (10 - 'A');
+ }
}