在学习长网址转短网址时,看到了十进制转62进制,将Long型的发号数转成62进制的字符编码,可以很方便的实现数据与字符映射关系。
package com.zsm.commonexample.Encryption; import org.apache.commons.lang3.StringUtils; /** * 10进制数与62进制数相互转换 * <p> * 62进制最多有 2^62 - 1个, max:AzL8n0Y58m7 min: * * @Author: zengsm. * @Description: * @Date:Created in 2019/2/27 15:08. * @Modified By: */ public class ConvertorUtil { /** * 初始化 62 进制数据,索引位置代表转换字符的数值 0-61,比如 A代表10,z代表61 */ private static String CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; //private static String CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; /** * 进制转换比率 */ private static int SCALE = 62; /** * 匹配字符串只包含数字和大小写字母 */ private static String REGEX = "^[0-9a-zA-Z]+$"; //region 十进制数字与62进制字符串相互转换 /** * 十进制数字转为62进制字符串 * * @param val 十进制数字 * @param length 输出字符串长度 * @return 62进制字符串 */ public static String encode10To62(long val, int length) { return StringUtils.leftPad(encode10To62(val), length, ‘0‘); } /** * 十进制数字转为62进制字符串 * * @param val 十进制数字 * @return 62进制字符串 */ public static String encode10To62(long val) { if (val < 0) { throw new IllegalArgumentException("this is an Invalid parameter:" + val); } StringBuilder sb = new StringBuilder(); int remainder; while (Math.abs(val) > SCALE - 1) { //从最后一位开始进制转换,取转换后的值,最后反转字符串 remainder = Long.valueOf(val % SCALE).intValue(); sb.append(CHARS.charAt(remainder)); val = val / SCALE; } //获取最高位 sb.append(CHARS.charAt(Long.valueOf(val).intValue())); return sb.reverse().toString(); } /** * 十进制数字转为62进制字符串 * * @param val 62进制字符串 * @return 十进制数字 */ public static long decode62To10(String val) { if (val == null) { throw new NumberFormatException("null"); } if (!val.matches(REGEX)) { throw new IllegalArgumentException("this is an Invalid parameter:" + val); } String tmp = val.replace("^0*", ""); long result = 0; int index = 0; int length = tmp.length(); for (int i = 0; i < length; i++) { index = CHARS.indexOf(tmp.charAt(i)); result += (long)(index * Math.pow(SCALE, length - i - 1)); } return result; } //endregion }
以上是自己实现的工具类,方便后期学习使用。GitHub后期整理到了NumberUtils工具类中了,地址
备注:
作者:Shengming Zeng
博客:http://www.cnblogs.com/zengming/
严正声明:
1.由于本博客部分资源来自互联网,版权均归原作者所有。转载的目的是用于学术交流与讨论学习,将不对任何资源负法律责任。
2.若无意中侵犯到您的版权利益,请来信联系我,我会在收到信息后会尽快给予处理!
3.所有资源内容仅供学习交流之用,请勿用作商业用途,谢谢。
4.如有转发请注明出处,来源于http://www.cnblogs.com/zengming/ ,谢谢合作。
原文:https://www.cnblogs.com/zengming/p/10448862.html