Base64編碼
字元對應表
上表就是用來表示Base64,一共64個字元,A-Z,a-z,0-9,+,-,還有=(作為補位)
無論將檔案,字串,還是什麼轉為Base64,一定是用上表的字元表示。
轉換方式是將三個位元組分為一個單元,因為一個位元組佔8位,所以一個單元就是24位,然後將一個單元又分為四個部分,每一部分
是6位,在每個部分前面補00,於是一個單元就變成了32位,也就是4個位元組,然後算出每一部分的十進位制,再對應Base64字元對應表上面的
符號,一單元的四個部分加起來就是Base64,說得比較抽象,我們用圖來說話
如上圖我們對字串"LIU"進行Base64編碼,因為剛好為3個位元組,所以為一個單元,LIU對應的ASCII碼為76,73,85,對應的二進位制分別為
01001100,01001001,01010101,然後將其分為四部分並補0後為,00010011,00000100,00100101,00010101,它們所對應的Base64
索引和字元為,19(T) , 4(E) , 37(l) , 21(V) , 所以"LIU"編譯後的Base64編碼為"TElV"
如果是兩個位元組
兩個位元組的情況分為三組,第三組只有四位(1001),這時候要再首尾都加2個0,為(00100100),計算出來是 TEk ,因為只有兩個位元組,所以第三個用=代替,加上=,
為 TEk=
如果一個位元組
一個位元組則分為兩組,第二組為00,前面補00,後面補0000,為(00000000),在Base64上面對應A,所以為"TA",因為為一個位元組,所以後兩個用==代替,為 TA==
漢字轉為Base64編碼
對於漢字轉Base64編碼,首先要確定編碼方式,又utf-8,utf-16,utf-32,gbk等等,每種編碼的漢字對應的Base64是不相同的,比如"劉"的編碼方式為utf-8
,那麼用Base64編碼後為5YiY,如果編碼方式為utf-16,那麼經過Base64編碼後為**/v9SGA==**,所以不同的編碼方式對應不同的Base64編碼,
如果用utf-8編碼的文字轉為Base64編碼,用utf-16對Base64進行解碼,那麼解碼得到的將為亂碼。
JAVA API
編碼
Base64.getEncoder().encode(byte[] bytes);
Base64.getEncoder().encodeToString(byte[] bytes);
and so on
解碼
Base64.getDecoder().decode(byte[] bytes);
and so on
示例
/**
* TODO
*
* @author 劉牌
* @version 1.0
* @date 2021/9/7 0007 21:25
*/
public class Base64Test {
public static void main(String[] args) {
String str = "LIU";
String s = Base64.getEncoder().encodeToString(str.getBytes(Charset.forName("utf-16")));
System.out.println(s);
byte[] bytes = Base64.getDecoder().decode(s.getBytes());
String s1 = new String(bytes, Charset.forName("utf-16"));
System.out.println(s1);
}
}