1. 程式人生 > >Base64編碼換行符問題解決

Base64編碼換行符問題解決

概述

Base64是一種字串編碼格式,Base64採用A-Z a-z 0-9 “+“ “/“這一共64個字元來編碼原始字元(還有墊字元“=“)。一個字元本身是1個位元組,也就是8位,而Base64編碼後的一個字元只能表示能表示6位的資訊。也就是原始字串中3位元組的資訊編碼會變成4位元組的資訊。Base64的主要作用是滿足MIME傳輸需求,在傳輸過程中都是用ASCII支援的可見字元。Base64是基於位元組的編碼,所以不同字符集下的相同字元在Base64下可能有著不同編碼

問題描述

在進過Base64編碼後的字串無法解碼,解碼時提示RuntimeError 

將編碼後的字串輸出後發現字串中存在換行符

測試程式

import it.sauronsoftware.base64.Base64;

public class TestBase64 {
    public static void main(String[] args){
        String message = "{\"begin_time\":\"2016-09-13T19:06:00+08:00\",\"end_time\":\"2016-10-29T19:06:00+08:00\",\"name\":\"testExam\",\"score\":[{\"score\":\"0\",\"qid\":\"1\"}],\"questions\":[{\"name\":\"A+B\",\"qid\":\"1\"}],\"eid\":\"1\"}";
        System.out.println(Base64.encode(message));

    }
}

程式輸出

eyJiZWdpbl90aW1lIjoiMjAxNi0wOS0xM1QxOTowNjowMCswODowMCIsImVuZF90aW1lIjoiMjAx
Ni0xMC0yOVQxOTowNjowMCswODowMCIsIm5hbWUiOiJ0ZXN0RXhhbSIsInNjb3JlIjpbeyJzY29y
ZSI6IjAiLCJxaWQiOiIxIn1dLCJxdWVzdGlvbnMiOlt7Im5hbWUiOiJBK0IiLCJxaWQiOiIxIn1d
LCJlaWQiOiIxIn0=

觀察測試結果

  • base64編碼後出現了換行符
  • 如果去除換行符 字串能正常解碼

原因分析

根據RFC822規定,BASE64Encoder編碼每76個字元,還需要加上一個回車換行 
部分Base64編碼的java庫還按照這個標準實行

解決方案

換用Apache的 commons-codec.jar, Base64.encodeBase64String(byte[])得到的編碼字串是不帶換行符的

關注微信公眾號和今日頭條,精彩文章持續更新中。。。。。