• Base62编码与62进制


    Base62编码

    Base62编码与Base64编码类似,都用于数据内容编码。基本原理请参看《Base64算法》。 

    import java.io.ByteArrayOutputStream;
    
    /**
     * Created by shijiaqi on 16/8/3.
     */
    public class Base62Codec {
        private static char[] encodes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
    
        private static byte[] decodes = new byte[256];
        static {
            for (int i = 0; i < encodes.length; i++) {
                decodes[encodes[i]] = (byte) i;
            }
        }
    
        /**
         * 将data编码成Base62的字符串
         * @param data
         * @return
         */
        public static String encodeBase62(byte[] data) {
            StringBuffer sb = new StringBuffer(data.length * 2);
            int pos = 0, val = 0;
            for (int i = 0; i < data.length; i++) {
                val = (val << 8) | (data[i] & 0xFF);
                pos += 8;
                while (pos > 5) {
                    char c = encodes[val >> (pos -= 6)];
                    sb.append(
                        c == 'i' ? "ia" :
                        c == '+' ? "ib" :
                        c == '/' ? "ic" : c
                    );
                    val &= ((1 << pos) - 1);
                }
            }
            if (pos > 0) {
                char c = encodes[val << (6 - pos)];
                sb.append(
                    c == 'i' ? "ia" :
                    c == '+' ? "ib" :
                    c == '/' ? "ic" : c
                );
            }
            return sb.toString();
        }
    
        /**
         * 将字符串解码成byte数组
         * @param string
         * @return
         */
        public static byte[] decodeBase62(String string) {
            if(string==null){
                return null;
            }
            char[] data=string.toCharArray();
            ByteArrayOutputStream baos = new ByteArrayOutputStream(string.toCharArray().length);
            int pos = 0, val = 0;
            for (int i = 0; i < data.length; i++) {
                char c = data[i];
                if (c == 'i') {
                    c = data[++i];
                    c =
                        c == 'a' ? 'i' :
                        c == 'b' ? '+' :
                        c == 'c' ? '/' : data[--i];
                }
                val = (val << 6) | decodes[c];
                pos += 6;
                while (pos > 7) {
                    baos.write(val >> (pos -= 8));
                    val &= ((1 << pos) - 1);
                }
            }
            return baos.toByteArray();
        }
    }

    以上代码来自网络

    62进制

    将数字与62个字符进行转换,可以有效缩减数字长度。不多解释。

    直接贴代码:

    public class Number62 {
        public static String ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    
        private static String encoding(long num) {
            if(num < 1)
                throw new IllegalArgumentException("num must be greater than 0.");
    
            StringBuilder sb = new StringBuilder();
            for (; num > 0; num /= 62) {
                sb.append(ALPHABET.charAt((int) (num % 62)));
            }
    
            return sb.toString();
        }
    
        private static long decoding(String str) {
            if(str==null || str.trim().length() == 0 ){
                throw new IllegalArgumentException("str must not be empty.");
            }
    
            long result = 0;
            for (int i = 0; i < str.length(); i++) {
                result += ALPHABET.indexOf(str.charAt(i)) * Math.pow(62, i);
            }
    
            return result;
        }
    
    }

    类似的代码网上有很多,以上代码来自这里

  • 相关阅读:
    摘抄博文
    html5中getContext()方法和CanvasRenderingContext2D对象详解
    三十四、Android Spinner控件之键值对用法
    二十七、Android之GPS定位详解
    J2EE用监听器实现同一用户只能有一个在线
    三十二、Android上传文件至服务器
    二十六、Android WebView缓存
    三十九、Android原理 不需要关闭后台运行程序
    三十七、android sqlite3详解
    struts2之注解权限控制
  • 原文地址:https://www.cnblogs.com/shijiaqi1066/p/5732917.html
Copyright © 2020-2023  润新知