說(shuō)明:
1、后臺(tái)請(qǐng)求的Base64的數(shù)據(jù),安卓客戶(hù)端只是做轉(zhuǎn)接作用,比如后臺(tái)請(qǐng)求到調(diào)用中國(guó)銀行app的Base64數(shù)據(jù),要調(diào)用中國(guó)銀行app,在轉(zhuǎn)接數(shù)據(jù)啟動(dòng)中國(guó)銀行app時(shí)候,app解析數(shù)據(jù)出錯(cuò),原因就是轉(zhuǎn)接過(guò)程中Base64數(shù)據(jù)被增加了換行 \n
2、手機(jī)拍照身份證時(shí)候,把圖片用Base64轉(zhuǎn)換一下,如果用的DEFAULT時(shí)候,數(shù)據(jù)里面也有換行
例如:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] datas = baos.toByteArray();
String imageDatasString = Base64.encodeToString(datas, Base64.DEFAULT);
解決:
Base64編碼,發(fā)現(xiàn)編碼后總是有換行,google后發(fā)現(xiàn)字符串過(guò)長(zhǎng)(一般超過(guò)76)時(shí)會(huì)自動(dòng)在中間加一個(gè)換行符,不能使用默認(rèn)設(shè)置,改為NO_WRAP就可以了
android.util.Base64.encodeToString(string.getBytes(), Base64.NO_WRAP);
注1:Base64幾個(gè)參數(shù)說(shuō)明
CRLF 這個(gè)參數(shù)看起來(lái)比較眼熟,它就是Win風(fēng)格的換行符,意思就是使用CR LF這一對(duì)作為一行的結(jié)尾而不是Unix風(fēng)格的LF
DEFAULT 這個(gè)參數(shù)是默認(rèn),使用默認(rèn)的方法來(lái)加密
NO_PADDING 這個(gè)參數(shù)是略去加密字符串最后的”=”
NO_WRAP 這個(gè)參數(shù)意思是略去所有的換行符(設(shè)置后CRLF就沒(méi)用了)
URL_SAFE 這個(gè)參數(shù)意思是加密時(shí)不使用對(duì)URL和文件名有特殊意義的字符來(lái)作為加密字符,具體就是以-和_取代+和/
注2:深層次原因
Base64是一種字符串編碼格式,Base64采用A-Z a-z 0-9 “+“ “/“這一共64個(gè)字符來(lái)編碼原始字符(還有墊字符“=“)。一個(gè)字符本身是1個(gè)字節(jié),也就是8位,而B(niǎo)ase64編碼后的一個(gè)字符只能表示能表示6位的信息。也就是原始字符串中3字節(jié)的信息編碼會(huì)變成4字節(jié)的信息。Base64的主要作用是滿(mǎn)足MIME傳輸需求,在傳輸過(guò)程中都是用ASCII支持的可見(jiàn)字符。Base64是基于字節(jié)的編碼,所以不同字符集下的相同字符在Base64下可能有著不同編碼。根據(jù)RFC822規(guī)定,BASE64Encoder編碼每76個(gè)字符,還需要加上一個(gè)回車(chē)換行 部分Base64編碼的java庫(kù)還按照這個(gè)標(biāo)準(zhǔn)實(shí)行,所以會(huì)有又換行符。