OSDN Git Service

Optimize byte[]->String/String->byte[] master
authorjwat <jwat@users.sourceforge.jp>
Mon, 19 Nov 2012 10:35:39 +0000 (19:35 +0900)
committerjwat <jwat@users.sourceforge.jp>
Mon, 19 Nov 2012 10:35:39 +0000 (19:35 +0900)
jp/bitmeister/asn1/value/HexString.java

index 006391d..f4068a4 100644 (file)
@@ -29,6 +29,12 @@ import jp.bitmeister.asn1.exception.ASN1IllegalArgument;
 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;
@@ -49,7 +55,7 @@ public class HexString implements StringItem {
                        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);
                        }
@@ -67,7 +73,8 @@ public class HexString implements StringItem {
        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();
        }
@@ -89,10 +96,10 @@ public class HexString implements StringItem {
        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;
@@ -107,15 +114,14 @@ public class HexString implements StringItem {
         * @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;
        }
@@ -130,4 +136,13 @@ public class HexString implements StringItem {
                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');
+       }
 }