LALA  
          日歷
          <2009年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          留言簿(1)

          隨筆分類(31)

          文章分類(4)

          收藏夾(21)

          搜索

          •  

          積分與排名

          • 積分 - 29910
          • 排名 - 1389

          最新隨筆

          最新評(píng)論

          閱讀排行榜

           
          Google Base64可以搜到相關(guān)原理和許多實(shí)現(xiàn)。
          下面是我的實(shí)現(xiàn),和SUN公司提供的參考實(shí)現(xiàn)。
            1 public class Base64 {
            2     static String base64_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
            3 
            4     /**
            5      * 編碼原理:將3個(gè)字節(jié)轉(zhuǎn)換成4個(gè)字節(jié)( (3 X 8) = 24 = (4 X 6) )
            6      * 先讀入3個(gè)字節(jié),每讀一個(gè)字節(jié),左移8位,再右移四次,每次6位,這樣就有4個(gè)字節(jié)了
            7      * 
            8      * @param data
            9      * @return 編碼后的Base64字符串
           10      */
           11     public static String Base64Encode(byte[] data) {
           12         StringBuilder builder = new StringBuilder();
           13         int[] temp = new int[4];
           14         int len = data.length - data.length % 3;
           15         for (int i = 0; i < len; i += 3) {
           16             int goal = 0;
           17             for (int j = 0; j < 3; j++) {
           18                 goal <<= 8;
           19                 goal |= (data[i + j] & 0xff);
           20             }
           21             for (int k = 0; k < 4; k++) {
           22                 temp[k] = goal & 0x3f;
           23                 goal >>= 6;
           24             }
           25             for (int k = 3; k >= 0; k--) {
           26                 builder.append(base64_alphabet.charAt(temp[k]));
           27             }
           28         }
           29         int index;
           30         switch (data.length % 3) {
           31         case 1:
           32             index = data[data.length - 1>> 2;
           33             builder.append(base64_alphabet.charAt(index));
           34             index = (data[data.length - 1& 0x03<< 4;
           35             builder.append(base64_alphabet.charAt(index));
           36             builder.append("==");
           37             break;
           38         case 2:
           39             index = data[data.length - 1 - 1>> 2;
           40             builder.append(base64_alphabet.charAt(index));
           41             index = (data[data.length - 1 - 1& 0x03<< 4
           42                     | data[data.length - 1>> 4;
           43             builder.append(base64_alphabet.charAt(index));
           44             index = (data[data.length - 1& 0x0f<< 2;
           45             builder.append(base64_alphabet.charAt(index));
           46             builder.append('=');
           47             break;
           48         }
           49         return builder.toString();
           50     }
           51 
           52     /**
           53      * 解碼原理:將4個(gè)字節(jié)轉(zhuǎn)換成3個(gè)字節(jié). 先讀入4個(gè)6位(用或運(yùn)算),每次左移6位,再右移3次,每次8位.
           54      * 
           55      * @param data
           56      *            需解碼的Base64字符串。
           57      * @return byte[]-解碼出的字節(jié)數(shù)組
           58      */
           59     public static byte[] Base64Decode(String data) {
           60         char[] chArray = data.toCharArray();
           61         int len = chArray.length;
           62         byte[] result = new byte[len * 3 / 4];
           63         for (int i = 0, res_i = 0; i < len; i += 4, res_i += 3) {
           64             int goal = 0;
           65             int index = 0;
           66             for (int k = 0; k < 4; k++) {
           67                 index = base64_alphabet.indexOf(chArray[i + k]);
           68                 goal <<= 6;
           69                 goal |= index;
           70             }
           71             for (int j = 2; j >= 0; j--) {
           72                 result[res_i + j] = (byte) goal;
           73                 goal >>= 8;
           74             }
           75         }
           76         // 等號(hào)=的處理
           77         if (chArray[len - 1!= '=')
           78             return result;
           79         else if (chArray[len - 2== '=')
           80             return Arrays.copyOf(result, result.length - 2);
           81         else
           82             return Arrays.copyOf(result, result.length - 1);
           83 
           84     }
           85 // 將 s 進(jìn)行 BASE64 編碼
           86     public static String getBASE64(String s) {
           87         if (s == null)
           88             return null;
           89         return (new sun.misc.BASE64Encoder()).encode(s.getBytes());
           90     }
           91 
           92     // 將 BASE64 編碼的字符串 s 進(jìn)行解碼
           93     public static String getFromBASE64(String s) {
           94         if (s == null)
           95             return null;
           96         BASE64Decoder decoder = new BASE64Decoder();
           97         try {
           98             byte[] b = decoder.decodeBuffer(s);
           99             return new String(b);
          100         } catch (Exception e) {
          101             return null;
          102         }
          103     }
          104 }


          posted on 2008-12-23 17:36 Dest 閱讀(2085) 評(píng)論(2)  編輯  收藏 所屬分類: Java算法
           
          Copyright © Dest Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 沭阳县| 雅安市| 永和县| 临泽县| 梁河县| 峡江县| 石嘴山市| 湖南省| 买车| 怀远县| 陆川县| 木里| 土默特左旗| 泰兴市| 伊春市| 祁阳县| 崇仁县| 赫章县| 修文县| 克拉玛依市| 浙江省| 临江市| 呼玛县| 正宁县| 康定县| 门源| 毕节市| 徐汇区| 苏尼特右旗| 新巴尔虎左旗| 兴化市| 潼南县| 莱阳市| 台湾省| 屏南县| 佛山市| 墨竹工卡县| 闸北区| 连城县| 公安县| 内江市|