BASE64Encoder 转BASE64

    技术2022-05-20  52

          在项目中需要把数据库中的图片转成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();      }  }

     

     

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


    最新回复(0)