Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码

package com.duanlian.daimengmusic.utils;
public final class Base64Util {
   private static final int BASELENGTH = 128 ;
   private static final int LOOKUPLENGTH = 64 ;
   private static final int TWENTYFOURBITGROUP = 24 ;
   private static final int EIGHTBIT = 8 ;
   private static final int SIXTEENBIT = 16 ;
   private static final int FOURBYTE = 4 ;
   private static final int SIGN = - 128 ;
   private static char PAD = '=' ;
   private static byte [] base64Alphabet = new byte [BASELENGTH];
   private static char [] lookUpBase64Alphabet = new char [LOOKUPLENGTH];
   static {
     for ( int i = 0 ; i < BASELENGTH; ++i) {
       base64Alphabet[i] = - 1 ;
     }
     for ( int i = 'Z' ; i >= 'A' ; i--) {
       base64Alphabet[i] = ( byte ) (i - 'A' );
     }
     for ( int i = 'z' ; i >= 'a' ; i--) {
       base64Alphabet[i] = ( byte ) (i - 'a' + 26 );
     }
     for ( int i = '9' ; i >= '0' ; i--) {
       base64Alphabet[i] = ( byte ) (i - '0' + 52 );
     }
     base64Alphabet[ '+' ] = 62 ;
     base64Alphabet[ '/' ] = 63 ;
     for ( int i = 0 ; i <= 25 ; i++) {
       lookUpBase64Alphabet[i] = ( char ) ( 'A' + i);
     }
     for ( int i = 26 , j = 0 ; i <= 51 ; i++, j++) {
       lookUpBase64Alphabet[i] = ( char ) ( 'a' + j);
     }
     for ( int i = 52 , j = 0 ; i <= 61 ; i++, j++) {
       lookUpBase64Alphabet[i] = ( char ) ( '0' + j);
     }
     lookUpBase64Alphabet[ 62 ] = ( char ) '+' ;
     lookUpBase64Alphabet[ 63 ] = ( char ) '/' ;
   }
   private static boolean isWhiteSpace( char octect) {
     return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9 );
   }
   private static boolean isPad( char octect) {
     return (octect == PAD);
   }
   private static boolean isData( char octect) {
     return (octect < BASELENGTH && base64Alphabet[octect] != - 1 );
   }
   /**
    把64位byte数组转换成String
    */
   public static String encode( byte [] binaryData) {
     if (binaryData == null ) {
       return null ;
     }
     int lengthDataBits = binaryData.length * EIGHTBIT;
     if (lengthDataBits == 0 ) {
       return "" ;
     }
     int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
     int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
     int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1
         : numberTriplets;
     char encodedData[] = null ;
     encodedData = new char [numberQuartet * 4 ];
     byte k = 0 , l = 0 , b1 = 0 , b2 = 0 , b3 = 0 ;
     int encodedIndex = 0 ;
     int dataIndex = 0 ;
     for ( int i = 0 ; i < numberTriplets; i++) {
       b1 = binaryData[dataIndex++];
       b2 = binaryData[dataIndex++];
       b3 = binaryData[dataIndex++];
       l = ( byte ) (b2 & 0x0f );
       k = ( byte ) (b1 & 0x03 );
       byte val1 = ((b1 & SIGN) == 0 ) ? ( byte ) (b1 >> 2 )
           : ( byte ) ((b1) >> 2 ^ 0xc0 );
       byte val2 = ((b2 & SIGN) == 0 ) ? ( byte ) (b2 >> 4 )
           : ( byte ) ((b2) >> 4 ^ 0xf0 );
       byte val3 = ((b3 & SIGN) == 0 ) ? ( byte ) (b3 >> 6 )
           : ( byte ) ((b3) >> 6 ^ 0xfc );
       encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
       encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4 )];
       encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2 ) | val3];
       encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f ];
     }
     // form integral number of 6-bit groups
     if (fewerThan24bits == EIGHTBIT) {
       b1 = binaryData[dataIndex];
       k = ( byte ) (b1 & 0x03 );
       byte val1 = ((b1 & SIGN) == 0 ) ? ( byte ) (b1 >> 2 )
           : ( byte ) ((b1) >> 2 ^ 0xc0 );
       encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
       encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4 ];
       encodedData[encodedIndex++] = PAD;
       encodedData[encodedIndex++] = PAD;
     } else if (fewerThan24bits == SIXTEENBIT) {
       b1 = binaryData[dataIndex];
       b2 = binaryData[dataIndex + 1 ];
       l = ( byte ) (b2 & 0x0f );
       k = ( byte ) (b1 & 0x03 );
       byte val1 = ((b1 & SIGN) == 0 ) ? ( byte ) (b1 >> 2 )
           : ( byte ) ((b1) >> 2 ^ 0xc0 );
       byte val2 = ((b2 & SIGN) == 0 ) ? ( byte ) (b2 >> 4 )
           : ( byte ) ((b2) >> 4 ^ 0xf0 );
       encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
       encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4 )];
       encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2 ];
       encodedData[encodedIndex++] = PAD;
     }
     return new String(encodedData);
   }
   /**
    * 把Base64位编码转换成byte数组
    */
   public static byte [] decode(String encoded) {
     if (encoded == null ) {
       return null ;
     }
     char [] base64Data = encoded.toCharArray();
     // remove white spaces
     int len = removeWhiteSpace(base64Data);
     if (len % FOURBYTE != 0 ) {
       return null ; // should be divisible by four
     }
     int numberQuadruple = (len / FOURBYTE);
     if (numberQuadruple == 0 ) {
       return new byte [ 0 ];
     }
     byte decodedData[] = null ;
     byte b1 = 0 , b2 = 0 , b3 = 0 , b4 = 0 ;
     char d1 = 0 , d2 = 0 , d3 = 0 , d4 = 0 ;
     int i = 0 ;
     int encodedIndex = 0 ;
     int dataIndex = 0 ;
     decodedData = new byte [(numberQuadruple) * 3 ];
     for (; i < numberQuadruple - 1 ; i++) {
       if (!isData((d1 = base64Data[dataIndex++]))
           || !isData((d2 = base64Data[dataIndex++]))
           || !isData((d3 = base64Data[dataIndex++]))
           || !isData((d4 = base64Data[dataIndex++]))) {
         return null ;
       } // if found "no data" just return null
       b1 = base64Alphabet[d1];
       b2 = base64Alphabet[d2];
       b3 = base64Alphabet[d3];
       b4 = base64Alphabet[d4];
       decodedData[encodedIndex++] = ( byte ) (b1 << 2 | b2 >> 4 );
       decodedData[encodedIndex++] = ( byte ) (((b2 & 0xf ) << 4 ) | ((b3 >> 2 ) & 0xf ));
       decodedData[encodedIndex++] = ( byte ) (b3 << 6 | b4);
     }
     if (!isData((d1 = base64Data[dataIndex++]))
         || !isData((d2 = base64Data[dataIndex++]))) {
       return null ; // if found "no data" just return null
     }
     b1 = base64Alphabet[d1];
     b2 = base64Alphabet[d2];
     d3 = base64Data[dataIndex++];
     d4 = base64Data[dataIndex++];
     if (!isData((d3)) || !isData((d4))) { // Check if they are PAD characters
       if (isPad(d3) && isPad(d4)) {
         if ((b2 & 0xf ) != 0 ) // last 4 bits should be zero
         {
           return null ;
         }
         byte [] tmp = new byte [i * 3 + 1 ];
         System.arraycopy(decodedData, 0 , tmp, 0 , i * 3 );
         tmp[encodedIndex] = ( byte ) (b1 << 2 | b2 >> 4 );
         return tmp;
       } else if (!isPad(d3) && isPad(d4)) {
         b3 = base64Alphabet[d3];
         if ((b3 & 0x3 ) != 0 ) // last 2 bits should be zero
         {
           return null ;
         }
         byte [] tmp = new byte [i * 3 + 2 ];
         System.arraycopy(decodedData, 0 , tmp, 0 , i * 3 );
         tmp[encodedIndex++] = ( byte ) (b1 << 2 | b2 >> 4 );
         tmp[encodedIndex] = ( byte ) (((b2 & 0xf ) << 4 ) | ((b3 >> 2 ) & 0xf ));
         return tmp;
       } else {
         return null ;
       }
     } else { // No PAD e.g 3cQl
       b3 = base64Alphabet[d3];
       b4 = base64Alphabet[d4];
       decodedData[encodedIndex++] = ( byte ) (b1 << 2 | b2 >> 4 );
       decodedData[encodedIndex++] = ( byte ) (((b2 & 0xf ) << 4 ) | ((b3 >> 2 ) & 0xf ));
       decodedData[encodedIndex++] = ( byte ) (b3 << 6 | b4);
     }
     return decodedData;
   }
   /**
    * remove WhiteSpace from MIME containing encoded Base64Util data.
    *
    * @param data
    *      the byte array of base64 data (with WS)
    * @return the new length
    */
   private static int removeWhiteSpace( char [] data) {
     if (data == null ) {
       return 0 ;
     }
     // count characters that's not whitespace
     int newSize = 0 ;
     int len = data.length;
     for ( int i = 0 ; i < len; i++) {
       if (!isWhiteSpace(data[i])) {
         data[newSize++] = data[i];
       }
     }
     return newSize;
   }
}
 
然后是我经过2次封装的类,注释很清楚,拿过去直接用就行
package com.duanlian.daimengmusic.utils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
  * 转换编码
  */
public class Base64Object {
   /**
    * 把base64的String码转换成正常显示的字符串
    */
   public static String base64ToString(String base64) {
     byte [] decode = Base64Util.decode(base64);
     String s = new String(decode);
     return s;
   }
   /**
    * 把String的转换成base64码
    */
   public static String stringToBase64(String ss) {
     byte [] bytes = ss.getBytes();
     String encode = Base64Util.encode(bytes);
     return encode;
   }
   /**
    * bitmap转为base64
    * @param bitmap
    * @return
    */
   public static String bitmapToBase641(Bitmap bitmap) {
     String result = null ;
     ByteArrayOutputStream baos = null ;
     try {
       if (bitmap != null ) {
         baos = new ByteArrayOutputStream();
         bitmap.compress(Bitmap.CompressFormat.JPEG, 100 , baos);
         baos.flush();
         baos.close();
         byte [] bitmapBytes = baos.toByteArray();
         result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
       }
     } catch (IOException e) {
       e.printStackTrace();
     } finally {
       try {
         if (baos != null ) {
           baos.flush();
           baos.close();
         }
       } catch (IOException e) {
         e.printStackTrace();
       }
     }
     return result;
   }
   /**
    * base64转为bitmap
    * @param base64Data
    * @return
    */
   public static Bitmap base64ToBitmap(String base64Data) {
     byte [] bytes = Base64.decode(base64Data, Base64.DEFAULT);
     return BitmapFactory.decodeByteArray(bytes, 0 , bytes.length);
   }
}
 
以上所述是小编给大家介绍的Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

转载于:https://www.cnblogs.com/yangxp107/p/8669190.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值