java自定义进制转换

进制原理:满N进1

代码实现:

package com.utils;

import java.util.Map;

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

    private static final int MAX_SALE = 256;

    /**
     * 字符库, 字符库的长度决定进制
     */
    private String symbols;

    public Base(String symbols) {

        // 字符库长度校验
        if(symbols.length() > MAX_SALE) {
            throw new RuntimeException(String.format("字符库长度不能超过%d", MAX_SALE));
        }
        // 重复校验
        if (!uniqueCheck(symbols)) {
            throw new RuntimeException("字符库不可重复");
        }

        this.symbols = symbols;

    }

    /**
     * 10进制转N进制
     * @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();
    }

    /**
     * N进制转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 (symbols.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 += symbols.indexOf(c) * power;
            power *= symbols.length();
        }
        return ret;
    }

    /**
     * 检查字符库是否有重复字符
     * @param symbols
     * @return
     */
    private boolean uniqueCheck(String symbols) {
        int[] charCount = new int[MAX_SALE];
        for (int i=0; i<symbols.length(); i++) {
            int symbolChar = symbols.charAt(i);
            charCount[symbolChar]++;
            if (charCount[symbolChar] > 1) {
                return false;
            }
        }
        return true;
    }

    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")

  

posted @ 2022-05-30 17:36  Carliels  阅读(397)  评论(0)    收藏  举报