• 10进制数与62进制数相互转换实例


      在学习长网址转短网址时,看到了十进制转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工具类中了,地址 

      https://github.com/lovelifeming/CommonExamples/blob/master/src/main/java/com/zsm/commonexample/util/NumberUtils.java

    备注:
    作者:Shengming Zeng
    博客:http://www.cnblogs.com/zengming/
    严正声明:
    1.由于本博客部分资源来自互联网,版权均归原作者所有。转载的目的是用于学术交流与讨论学习,将不对任何资源负法律责任。
    2.若无意中侵犯到您的版权利益,请来信联系我,我会在收到信息后会尽快给予处理!
    3.所有资源内容仅供学习交流之用,请勿用作商业用途,谢谢。
    4.如有转发请注明出处,来源于http://www.cnblogs.com/zengming/ ,谢谢合作。

  • 相关阅读:
    42.OC中instancetype与id的区别
    41.App 框架的搭建思路以及代码的规范
    44、WebStrom下载和破解
    40、IOS自动打包-Python脚本
    39、字符串去除空格
    38、当前时间是否在开放时间内(也就是时间对比)
    37、自定义气泡
    36、NSTimer使用详解-开启、关闭、移除
    35、输入框(UITextField)密码明暗文切换
    34、iOS App图标和启动画面尺寸
  • 原文地址:https://www.cnblogs.com/zengming/p/10448862.html
Copyright © 2020-2023  润新知