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

浙公网安备 33010602011771号