最近內建第三方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;
}
}