private void init(char chPlus, char chSplash, char chPad) {
        int index = 0;
        // build translate this.valueToChar table only once.
        // 0..25 -> 'A'..'Z'
        for (int i = 'A'; i <= 'Z'; i++) {
            this.valueToChar[index++] = (char) i;
        }

        // 26..51 -> 'a'..'z'
        for (int i = 'a'; i <= 'z'; i++) {
            this.valueToChar[index++] = (char) i;
        }

        // 52..61 -> '0'..'9'
        for (int i = '0'; i <= '9'; i++) {
            this.valueToChar[index++] = (char) i;
        }

        this.valueToChar[index++] = chPlus;
        this.valueToChar[index++] = chSplash;

        // build translate defaultCharToValue table only once.
        for (int i = 0; i < 256; i++) {
            this.charToValue[i] = IGNORE; // default is to ignore
        }

        for (int i = 0; i < 64; i++) {
            this.charToValue[this.valueToChar[i]] = i;
        }

        this.charToValue[chPad] = PAD;
        java.util.Arrays.fill(this.charToPad, chPad);
    }