64进制编码转换

由于项目需要把一个ID(数字)压缩成尽可能短字符串,在网上找来好久没有找到合适,

自己动手写一个。

有需要的可以参考一下,也作为自己的一些积累吧!

代码如下:

Java代码  收藏代码
  1. /** 
  2.  * 64进制和10进制的转换类 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public class compressEncodeing {  
  7.     final static char[] digits = {  
  8.         '0' , '1' , '2' , '3' , '4' , '5' ,  
  9.         '6' , '7' , '8' , '9' , 'a' , 'b' ,  
  10.         'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,  
  11.         'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,  
  12.         'o' , 'p' , 'q' , 'r' , 's' , 't' ,  
  13.         'u' , 'v' , 'w' , 'x' , 'y' , 'z' ,  
  14.         'A' , 'B' , 'C' , 'D' , 'E' , 'F' ,  
  15.         'G' , 'H' , 'I' , 'J' , 'K' , 'L' ,  
  16.         'M' , 'N' , 'O' , 'P' , 'Q' , 'R' ,  
  17.         'S' , 'T' , 'U' , 'V' , 'W' , 'X' ,  
  18.         'Y' , 'Z' , '+' , '/'  ,  
  19.         };  
  20.     /** 
  21.      * @param args 
  22.      */  
  23.     public static void main(String[] args) {  
  24.         System.out.println(CompressNumber(999999999999999999L,6));   
  25.         System.out.println(UnCompressNumber(CompressNumber(999999999999999999L,6)));  
  26.     }  
  27.     /** 
  28.      * 把10进制的数字转换成64进制 
  29.      * @param number 
  30.      * @param shift 
  31.      * @return 
  32.      */  
  33.     private static String CompressNumber(long number, int shift) {  
  34.         char[] buf = new char[64];  
  35.         int charPos = 64;  
  36.         int radix = 1 << shift;  
  37.         long mask = radix - 1;  
  38.         do {  
  39.             buf[--charPos] = digits[(int)(number & mask)];  
  40.             number >>>= shift;  
  41.         } while (number != 0);  
  42.         return new String(buf, charPos, (64 - charPos));  
  43.        }  
  44.     /** 
  45.      * 把64进制的字符串转换成10进制 
  46.      * @param decompStr 
  47.      * @return 
  48.      */  
  49.     private static long UnCompressNumber(String decompStr)  
  50.     {  
  51.         long result=0;  
  52.         for (int i =  decompStr.length()-1; i >=0; i--) {  
  53.             if(i==decompStr.length()-1)  
  54.             {  
  55.                 result+=getCharIndexNum(decompStr.charAt(i));  
  56.                 continue;  
  57.             }  
  58.             for (int j = 0; j < digits.length; j++) {  
  59.                 if(decompStr.charAt(i)==digits[j])  
  60.                 {  
  61.                     result+=((long)j)<<6*(decompStr.length()-1-i);  
  62.                 }  
  63.             }  
  64.         }  
  65.         return result;  
  66.     }     
  67.     /** 
  68.      *  
  69.      * @param ch 
  70.      * @return 
  71.      */  
  72.     private static long getCharIndexNum(char ch)  
  73.     {  
  74.         int num=((int)ch);  
  75.         if(num>=48&&num<=57)  
  76.         {  
  77.             return num-48;  
  78.         }  
  79.         else if(num>=97&&num<=122)  
  80.         {  
  81.             return num-87;  
  82.         }else if(num>=65&&num<=90)  
  83.         {  
  84.             return num-29;  
  85.         }else if(num==43)  
  86.         {  
  87.             return 62;  
  88.         }  
  89.         else if (num == 47)  
  90.         {  
  91.             return 63;  
  92.         }  
  93.         return 0;  
  94.     }  
  95.   
  96. }  
 
原文地址:https://www.cnblogs.com/exmyth/p/5674563.html