java自定義進位制轉換
阿新 • • 發佈:2022-05-30
進位制原理:滿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")