天天看點

Android中Base64編碼

最近內建第三方sdk時需要Basic Authentication認證,在用Base64編碼做簽權的時候用Base64.DEFAULT一直不能簽權成功,最後用Base64.NO_WRAP成功了。

後來查了一下原因,原來使用Base64.DEFAULT當字元串過長(一般超過76)時會自動在中間加一個換行符,字元串最後也會加一個換行符,這樣就導緻和其他子產品對接時結果不一緻,于是簽權失敗。而Base64.NO_WRAP 這個參數意思是略去所有的換行符,是以簽權成功。

是以Android端使用Base64加編碼解碼時應使用Base64.NO_WRAP。

其他幾種編碼解碼方式的含義:

CRLF:這個參數看起來比較眼熟,它就是Win風格的換行符,意思就是使用CR LF這一對作為一行的結尾而不是Unix風格的LF

DEFAULT:這個參數是預設,使用預設的方法來編碼

NO_PADDING:這個參數是略去編碼字元串最後的“=”

NO_WRAP:這個參數意思是略去所有的換行符(設定後CRLF就沒用了)

URL_SAFE:這個參數意思是編碼時不使用對URL和檔案名有特殊意義的字元來作為編碼字元,具體就是以-和_取代+和/
           

編碼解碼代碼如下:

public class Base64Utils {
	 // 編碼  
    public static String getBase64(String str) {  
        String result = "";  
        if( str != null) {
        	 try {  
             	result = new String(Base64.encode(str.getBytes("utf-8"), Base64.NO_WRAP),"utf-8");
             } catch (UnsupportedEncodingException e) {  
                 e.printStackTrace();  
             }  
        }
        return result;  
    }  
  
    // 解碼
    public static String getFromBase64(String str) {  
        String result = "";  
        if (str != null) {  
            try {
				result = new String(Base64.decode(str, Base64.NO_WRAP), "utf-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}  
        }  
        return result;  
    }  
}