Base64与Base62

From:http://iffiffj.javaeye.com/blog/618713

Base64和Base62的目的在都在于将需要传输的内容进行编码,尤其是一些特殊字符(如不可见字符、传输时与协议头冲突的字符)。 在安全领域,base62的编码使用较多。具体编码和解码的方式如下:

Base64编码 

Java代码 
  1. private static char[] encodes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  
  2.         .toCharArray();  
  3. private static byte[] decodes = new byte[256];  
  4. static {  
  5.     for (int i = 0; i < encodes.length; i++) {  
  6.         decodes[encodes[i]] = (byte) i;  
  7.     }  
  8. }  
  9.   
  10. public static StringBuffer encodeBase64(byte[] data) {  
  11.     StringBuffer sb = new StringBuffer(data.length * 2);  
  12.     int pos = 0, val = 0;  
  13.     for (int i = 0; i < data.length; i++) {  
  14.         val = (val << 8) | (data[i] & 0xFF);  
  15.         pos += 8;  
  16.         while (pos > 5) {  
  17.             sb.append(encodes[val >> (pos -= 6)]);  
  18.             val &= ((1 << pos) - 1);  
  19.         }  
  20.     }  
  21.     if (pos > 0) {  
  22.         sb.append(encodes[val << (6 - pos)]);  
  23.     }  
  24.     return sb;  
  25. }  
  26.   
  27. public static byte[] decodeBase64(char[] data) {  
  28.     ByteArrayOutputStream baos = new ByteArrayOutputStream(data.length);  
  29.     int pos = 0, val = 0;  
  30.     for (int i = 0; i < data.length; i++) {  
  31.         val = (val << 6) | decodes[data[i]];  
  32.         pos += 6;  
  33.         while (pos > 7) {  
  34.             baos.write(val >> (pos -= 8));  
  35.             val &= ((1 << pos) - 1);  
  36.         }  
  37.     }  
  38.     return baos.toByteArray();  
  39. }  

Base62编码  
Java代码 
  1. public static StringBuffer encodeBase62(byte[] data) {  
  2.     StringBuffer sb = new StringBuffer(data.length * 2);  
  3.     int pos = 0, val = 0;  
  4.     for (int i = 0; i < data.length; i++) {  
  5.         val = (val << 8) | (data[i] & 0xFF);  
  6.         pos += 8;  
  7.         while (pos > 5) {  
  8.             char c = encodes[val >> (pos -= 6)];  
  9.             sb.append(  
  10.             /**/c == 'i' ? "ia" :  
  11.             /**/c == '+' ? "ib" :  
  12.             /**/c == '/' ? "ic" : c);  
  13.             val &= ((1 << pos) - 1);  
  14.         }  
  15.     }  
  16.     if (pos > 0) {  
  17.         char c = encodes[val << (6 - pos)];  
  18.         sb.append(  
  19.         /**/c == 'i' ? "ia" :  
  20.         /**/c == '+' ? "ib" :  
  21.         /**/c == '/' ? "ic" : c);  
  22.     }  
  23.     return sb;  
  24. }  
  25.   
  26. public static byte[] decodeBase62(char[] data) {  
  27.     ByteArrayOutputStream baos = new ByteArrayOutputStream(data.length);  
  28.     int pos = 0, val = 0;  
  29.     for (int i = 0; i < data.length; i++) {  
  30.         char c = data[i];  
  31.         if (c == 'i') {  
  32.             c = data[++i];  
  33.             c =  
  34.             /**/c == 'a' ? 'i' :  
  35.             /**/c == 'b' ? '+' :  
  36.             /**/c == 'c' ? '/' : data[--i];  
  37.         }  
  38.         val = (val << 6) | decodes[c];  
  39.         pos += 6;  
  40.         while (pos > 7) {  
  41.             baos.write(val >> (pos -= 8));  
  42.             val &= ((1 << pos) - 1);  
  43.         }  
  44.     }  
  45.     return baos.toByteArray();  
  46. }