进制原理:满N进1

代码实现:

package com.utils;

/**
 * 自定义进制转换
 */
public class Base {

    /**
     * 字符库
     */
    private String symbols;

    public Base(String symbols) {
        this.symbols = symbols;
    }

    /**
     * 10进制转62进制
     * @param num
     * @return
     */
    public final String encode(long num) {
        if (num < 0) {
            throw new IllegalArgumentException("The input parameter cannot be negative");
        }
        StringBuffer sb = new StringBuffer();
        if (num == 0) {
            sb.append(symbols.charAt(0));
        }
        while(num > 0) {
            sb.append(symbols.charAt((int)(num % symbols.length())));
            num = num / symbols.length();
        }
        return sb.reverse().toString();
    }

    /**
     * 62进制转10进制
     * @param str
     * @return
     */
    public final long decode(String str) {
        if (str == null || str.length() < 1) {
            throw new IllegalArgumentException("The input parameter cannot be empty");
        }
        for (char c : str.toCharArray()) {
            if (indexOf(c) < 0) {
                throw new IllegalArgumentException("Unrecognized char "+ c);
            }
        }
        String rStr = new StringBuffer(str).reverse().toString();
        long ret = 0L;
        long power = 1;
        for (char c : rStr.toCharArray()) {
            ret +=indexOf(c)*power;
            power *= symbols.length();
        }
        return ret;
    }

    /**
     * 查询字符在字符表中的位置
     * @param c
     * @return
     */
    private int indexOf(char c) {
        return symbols.indexOf(c);
//        int idx = -1;
//        int cInt = c;
//        int start = 0;
//        int end = SYMBOLS.length;
//        // 判定跳出
//        if (c < SYMBOLS[start] || c>SYMBOLS[end-1]) {
//            return idx;
//        }
//        while ((end-start)>1) {
//            int middleIdx = (end-start) /2 + start;
//            if (SYMBOLS[middleIdx] <= cInt) {
//                start = middleIdx;
//            } else {
//                end = middleIdx;
//            }
//        }
//        if (SYMBOLS[start] == cInt) {
//            idx = start;
//        }
//        return idx;
    }

    public String getSymbols() {
        return symbols;
    }

    public void setSymbols(String symbols) {
        this.symbols = symbols;
    }
}

 

使用方式:

// 二进制
new Base("01").encode(15)
new Base("01").decode("101010")

// 三进制
new Base("012").encode(15)
new Base("012").decode("121120")

// 十六进制
new Base("0123456789ABCDEF").encode(15)
new Base("012").decode("1F")

// 62进制
new Base("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz").encode(15)
new Base("012").decode("AUxde97j")