对比网站
https://tool.lu/hexconvert
@UtilityClass
public class Long62Util {
private static char[] chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
/**
* 初始化 62 进制数据,索引位置代表字符的数值,比如 A代表10,Z代表61等
*/
private static int scale = 62;
private static char ZERO = '0';
public static String to62String(long num) {
return to62String(num, null);
}
/**
* 将数字转为62进制 * * @param num Long 型数字 * @param length 转换后的字符串长度,不足则左侧补0 * @return 62进制字符串
*/
public static String to62String(long num, Integer length) {
StringBuilder sb = new StringBuilder();
int remainder = 0;
while (num > scale - 1) {
/** * 对 scale 进行求余,然后将余数追加至 sb 中,由于是从末位开始追加的,因此最后需要反转(reverse)字符串 */
remainder = (int) (num % scale);
sb.append(chars[remainder]);
num = num / scale;
}
sb.append(chars[(int) num]);
String value = sb.reverse().toString();
if (length != null) {
return StringUtils.leftPad(value, length, ZERO);
} else {
return value;
}
}
private static int getIndex(char c) {
for (int i = 0; i < chars.length; i++) {
if (chars[i] == c) {
return i;
}
}
return -1;
}
/**
* 给定的字符串是否为有效的ObjectId
*
* @param s 字符串
* @return 是否为有效的ObjectId
*/
public static boolean isValid(String s) {
if (StringUtils.isBlank(s)) {
return false;
}
char c;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (c >= '0' && c <= '9') {
continue;
}
if (c >= 'a' && c <= 'z') {
continue;
}
if (c >= 'A' && c <= 'Z') {
continue;
}
return false;
}
return true;
}
/**
* 62进制字符串转为数字 * * @param str 编码后的62进制字符串 * @return 解码后的 10 进制字符串
*/
public static long longValue(String str) {
/** * 将 0 开头的字符串进行替换 */
str = str.replace("^0*", "");
long num = 0;
int index = 0;
for (int i = 0; i < str.length(); i++) {
/** * 查找字符的索引位置 */
index = getIndex(str.charAt(i));
/** * 索引位置代表字符的数值 */
num += (long) (index * (Math.pow(scale, str.length() - i - 1)));
}
return num;
}
}