BASE64Encoder 转BASE64

来源:互联网 发布:淘宝大学app ipad 编辑:程序博客网 时间:2024/06/07 02:02

      在项目中需要把数据库中的图片转成BASE64传给页面控件,控件来显示图片。

    java中我们常用sun.misc.BASE64Decoder来进行转码解码,在转成BASE64后传给控件控件显示的不是一张图片,但我自己解码可以在本地生成图片,经过跟踪发现当转成BASE64编码后每达到17个字节就会换行。

    尝试去掉转码后字符串种的换行符、空格,结果传给控件可以正常显示图像

    当出现传递过个图像时发现JAVA对于这种处理耗时太经过在网上查找得到以下方法,重载BASE64Encoder中的encode函数,效率可以提高一倍

 

package rfp;
public class BASE64Encoder {
 
     private static char[] codec_table = { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
             'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
             'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
             'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
             'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6',
             '7', '8', '9', '+', '/' };
 
     public BASE64Encoder() {
 
     }
 
     public String encode(byte[] a) {
         int totalBits = a.length * 8;
         int nn = totalBits % 6;
         int curPos = 0;// process bits
         StringBuffer toReturn = new StringBuffer();
         while (curPos < totalBits) {
             int bytePos = curPos / 8;
             switch (curPos % 8) {
             case 0:
                 toReturn.append(codec_table[(a[bytePos] & 0xfc) >> 2]);
                 break;
             case 2:
 
                 toReturn.append(codec_table[(a[bytePos] & 0x3f)]);
                 break;
             case 4:
                 if (bytePos == a.length - 1) {
                     toReturn
                             .append(codec_table[((a[bytePos] & 0x0f) << 2) & 0x3f]);
                 } else {
                     int pos = (((a[bytePos] & 0x0f) << 2) | ((a[bytePos + 1] & 0xc0) >> 6)) & 0x3f;
                     toReturn.append(codec_table[pos]);
                 }
                 break;
             case 6:
                 if (bytePos == a.length - 1) {
                     toReturn
                             .append(codec_table[((a[bytePos] & 0x03) << 4) & 0x3f]);
                 } else {
                     int pos = (((a[bytePos] & 0x03) << 4) | ((a[bytePos + 1] & 0xf0) >> 4)) & 0x3f;
                     toReturn.append(codec_table[pos]);
                 }
                 break;
             default:
                 //never hanppen
                 break;
             }
             curPos+=6;
         }
         if(nn==2)
         {
             toReturn.append("==");
         }
         else if(nn==4)
         {
             toReturn.append("=");
         }
         return toReturn.toString();
 
     }
 
 }

 

 

处理这个问题花了不不少时间记下来,希望遇到的朋友可以做个参考

原创粉丝点击