天天看點

Android Base64編碼出現換行

說明:

1、背景請求的Base64的資料,安卓用戶端隻是做轉接作用,比如背景請求到調用中國銀行app的Base64資料,要調用中國銀行app,在轉接資料啟動中國銀行app時候,app解析資料出錯,原因就是轉接過程中Base64資料被增加了換行 \n 

位址:安卓調用中國銀行參數Base64值資料解析異常

2、手機拍照身份證時候,把圖檔用Base64轉換一下,如果用的DEFAULT時候,資料裡面也有換行

例如:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                byte[] datas = baos.toByteArray();
                String imageDatasString = Base64.encodeToString(datas, Base64.DEFAULT);
           

解決:

Base64編碼,發現編碼後總是有換行,google後發現字元串過長(一般超過76)時會自動在中間加一個換行符,不能使用預設設定,改為NO_WRAP就可以了

android.util.Base64.encodeToString(string.getBytes(), Base64.NO_WRAP);
           

注1:Base64幾個參數說明

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

    DEFAULT 這個參數是預設,使用預設的方法來加密

    NO_PADDING 這個參數是略去加密字元串最後的”=”

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

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

注2:深層次原因

Base64是一種字元串編碼格式,Base64采用A-Z a-z 0-9 “+“ “/“這一共64個字元來編碼原始字元(還有墊字元“=“)。一個字元本身是1個位元組,也就是8位,而Base64編碼後的一個字元隻能表示能表示6位的資訊。也就是原始字元串中3位元組的資訊編碼會變成4位元組的資訊。Base64的主要作用是滿足MIME傳輸需求,在傳輸過程中都是用ASCII支援的可見字元。Base64是基于位元組的編碼,是以不同字元集下的相同字元在Base64下可能有着不同編碼。根據RFC822規定,BASE64Encoder編碼每76個字元,還需要加上一個回車換行 部分Base64編碼的java庫還按照這個标準實行,是以會有又換行符。