一文讀懂Base64編碼
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
Base64編碼
字符對(duì)應(yīng)表

上表就是用來表示Base64,一共64個(gè)字符,A-Z,a-z,0-9,+,/(上表打錯(cuò)了),還有=(作為補(bǔ)位)
無論將文件,字符串,還是什么轉(zhuǎn)為Base64,一定是用上表的字符表示。
轉(zhuǎn)換方式是將三個(gè)字節(jié)分為一個(gè)單元,因?yàn)橐粋€(gè)字節(jié)占8位,所以一個(gè)單元就是24位,然后將一個(gè)單元又分為四個(gè)部分,每一部分 是6位,在每個(gè)部分前面補(bǔ)00,于是一個(gè)單元就變成了32位,也就是4個(gè)字節(jié),然后算出每一部分的十進(jìn)制,再對(duì)應(yīng)Base64字符對(duì)應(yīng)表上面的 符號(hào),一單元的四個(gè)部分加起來就是Base64,說得比較抽象,我們用圖來說話

如上圖我們對(duì)字符串"LIU"進(jìn)行Base64編碼,因?yàn)閯偤脼?個(gè)字節(jié),所以為一個(gè)單元,LIU對(duì)應(yīng)的ASCII碼為76,73,85,對(duì)應(yīng)的二進(jìn)制分別為 01001100,01001001,01010101,然后將其分為四部分并補(bǔ)0后為,00010011,00000100,00100101,00010101,它們所對(duì)應(yīng)的Base64 索引和字符為,19(T) , 4(E) , 37(l) , 21(V) , 所以"LIU"編譯后的Base64編碼為"TElV"
如果是兩個(gè)字節(jié)

兩個(gè)字節(jié)的情況分為三組,第三組只有四位(1001),這時(shí)候要再首尾都加2個(gè)0,為(00100100),計(jì)算出來是 TEk ,因?yàn)橹挥袃蓚€(gè)字節(jié),所以第三個(gè)用=代替,加上=, 為 TEk=
如果一個(gè)字節(jié)

一個(gè)字節(jié)則分為兩組,第二組為00,前面補(bǔ)00,后面補(bǔ)0000,為(00000000),在Base64上面對(duì)應(yīng)A,所以為"TA",因?yàn)闉橐粋€(gè)字節(jié),所以后兩個(gè)用==代替,為 TA==
漢字轉(zhuǎn)為Base64編碼
對(duì)于漢字轉(zhuǎn)Base64編碼,首先要確定編碼方式,又utf-8,utf-16,utf-32,gbk等等,每種編碼的漢字對(duì)應(yīng)的Base64是不相同的,比如"劉"的編碼方式為utf-8 ,那么用Base64編碼后為5YiY,如果編碼方式為utf-16,那么經(jīng)過Base64編碼后為/v9SGA==,所以不同的編碼方式對(duì)應(yīng)不同的Base64編碼, 如果用utf-8編碼的文字轉(zhuǎn)為Base64編碼,用utf-16對(duì)Base64進(jìn)行解碼,那么解碼得到的將為亂碼。
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);
}
}
作者 | 渣男小四
來源 | cnblogs.com/steakliu/p/15240813.html

