进制原理:满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")